Nice programing

다른 스크립트를 사용하여 코드에서 후행 공백을 제거하는 방법은 무엇입니까?

nicepro 2020. 12. 12. 12:26
반응형

다른 스크립트를 사용하여 코드에서 후행 공백을 제거하는 방법은 무엇입니까?


다음과 같은 것 :

import fileinput

for lines in fileinput.FileInput("test.txt", inplace=1):
    lines = lines.strip()
    if lines == '': continue
    print lines

그러나 stdout에는 아무것도 인쇄되지 않습니다.

다음과 같은 문자열을 가정합니다 foo.

foo.lstrip() # to remove leading white space
foo.rstrip() # to remove trailing whitespace
foo.strip()  # to remove both lead and trailing whitespace

fileinput여러 입력 스트림을위한 것 같습니다. 이것이 내가 할 일입니다.

with open("test.txt") as file:
    for line in file:
        line = line.rstrip()
        if line:
            print(line)

키워드 인수 가 제공 되면 입력 파일로 리디렉션 print되기 때문에 명령문의 출력이 표시되지 않습니다 . 이로 인해 입력 파일이 효과적으로 다시 작성되고 나중에 살펴보면 그 안에있는 줄에 실제로 후행 또는 선행 공백이 없습니다 ( 문이 다시 추가 되는 각 줄의 끝에있는 줄 바꿈 제외 ).FileInputstdoutinplace=1print

후행 공백 만 제거하려면 rstrip()대신을 사용해야 합니다 strip(). 또한 참고 if lines == '': continue인 원인 빈 줄이 완전히 (여부에 관계없이의 제거 할 strip또는 rstrip사용됩니다).

입력 파일을 다시 작성하려는 의도가 아니라면 for line in open(filename):. 그렇지 않으면 sys.stderr다음과 같은 것을 사용하여 출력을 동시에 에코하여 파일에 기록되는 내용을 볼 수 있습니다 .

import fileinput
import sys

for line in (line.rstrip() for line in
                fileinput.FileInput("test.txt", inplace=1)):
    if line:
        print line
        print >>sys.stderr, line

PEP8을 정리하려는 경우 전체 프로젝트의 후행 공백을 제거합니다.

import os

PATH = '/path/to/your/project'

for path, dirs, files in os.walk(PATH):
    for f in files:
        file_name, file_extension = os.path.splitext(f)
        if file_extension == '.py':
            path_name = os.path.join(path, f)
            with open(path_name, 'r') as fh:
                new = [line.rstrip() for line in fh]
            with open(path_name, 'w') as fh:
                [fh.write('%s\n' % line) for line in new]

이 물건의 일종 sed이다 정말 잘 : $ sed 's/[ \t]*$//'. \t이 작업을 수행하는 대신 TAB 문자를 문자 그대로 입력해야 할 수도 있습니다.


fileinput.FileInput은 생성기입니다. 따라서 한 번만 반복 할 수 있으며 모든 항목이 소비되고 다음 메서드를 호출 하면 StopIteration이 발생 합니다. 행을 두 번 이상 반복하려면 목록에 넣을 수 있습니다.

list(fileinput.FileInput('test.txt'))

그런 다음 rstrip호출하십시오 .


다른 이름으로 저장 fix_whitespace.py:

#!/usr/bin/env python
"""
Fix trailing whitespace and line endings (to Unix) in a file.
Usage: python fix_whitespace.py foo.py
"""

import os
import sys


def main():
    """ Parse arguments, then fix whitespace in the given file """
    if len(sys.argv) == 2:
        fname = sys.argv[1]
        if not os.path.exists(fname):
            print("Python file not found: %s" % sys.argv[1])
            sys.exit(1)
    else:
        print("Invalid arguments. Usage: python fix_whitespace.py foo.py")
        sys.exit(1)
    fix_whitespace(fname)


def fix_whitespace(fname):
    """ Fix whitespace in a file """
    with open(fname, "rb") as fo:
        original_contents = fo.read()
    # "rU" Universal line endings to Unix
    with open(fname, "rU") as fo:
        contents = fo.read()
    lines = contents.split("\n")
    fixed = 0
    for k, line in enumerate(lines):
        new_line = line.rstrip()
        if len(line) != len(new_line):
            lines[k] = new_line
            fixed += 1
    with open(fname, "wb") as fo:
        fo.write("\n".join(lines))
    if fixed or contents != original_contents:
        print("************* %s" % os.path.basename(fname))
    if fixed:
        slines = "lines" if fixed > 1 else "line"
        print("Fixed trailing whitespace on %d %s" \
              % (fixed, slines))
    if contents != original_contents:
        print("Fixed line endings to Unix (\\n)")


if __name__ == "__main__":
    main()

여러 python줄 프로그램을 작성할 필요가 없기 때문에이 작업 에 사용할 것을 제안하는 여러 답변을 보는 것은 약간 놀랍습니다 .

sed, awk또는 같은 표준 Unix 도구 perl는 명령 줄에서 직접 쉽게 수행 할 수 있습니다.

예를 들어 어디서든 perl(일반적으로 Windows, Mac, Linux) OP에서 요청한 내용을 다음과 같이 달성해야합니다.

perl -i -pe 's/[ \t]+$//;' files...

Explanation of the arguments to perl:

-i   # run the edit "in place" (modify the original file)
-p   # implies a loop with a final print over every input line
-e   # next arg is the perl expression to apply (to every line)

s/[ \t]$// is a substitution regex s/FROM/TO/: replace every trailing (end of line) non-empty space (spaces or tabs) with nothing.

Advantages:

  • One liner, no programming needed
  • Works on multiple (any number) of files
  • Works correctly on standard-input (no file arguments given)

More generally, if you want to modify any number of files directly from the command line, replacing every appearance of FOO with BAR, you may always use this generic template:

perl -i -pe 's/FOO/BAR/' files...

참고URL : https://stackoverflow.com/questions/5411603/how-to-remove-trailing-whitespace-in-code-using-another-script

반응형