Ответ 1
fileinput
представляется для нескольких входных потоков. Это то, что я сделал бы:
with open("test.txt") as file:
for line in file:
line = line.rstrip()
if line:
print line
Что-то вроде:
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
, потому что FileInput
перенаправляет stdout
во входной файл, когда задан аргумент ключевого слова inplace=1
. Это приводит к тому, что входной файл будет эффективно перезаписан, и если вы посмотрите на него, то строки в нем действительно не будут иметь никаких конечных или ведущих пробелов в них (кроме новой строки в конце каждого из которых оператор print
добавляет обратно).
Если вы хотите удалить только пробелы, используйте 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]
Кажется, 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()
Это то, что sed
действительно хорош в: $ sed 's/[ \t]*$//'
. Имейте в виду, что вам, вероятно, понадобится буквально ввести символ TAB вместо \t
, чтобы это работало.