1

在编辑文件内容时,我一直在使用以下方法:

  1. 以读取模式打开文件
  2. 使用该方法将文件内容转换为字符串.read()并分配给另一个变量
  3. 关闭文件
  4. 对字符串做事
  5. 以写入模式打开原始文件
  6. 将字符串写入文件
  7. 关闭文件

例如:

fo = open('file.html', r)
fo_as_string = fo.read()
fo.close()
#  # #
# do stuff to fo_as_string here
#  # #
fo = open('file.html', w)
fo.write(fo_as_string)
fo.close()

我现在发现自己处于这种情况,但是我需要在行的开头删除任何空格,并且我认为由于我已将文件对象转换为字符串,因此无法在“行”级别定位该空格,使用 lstrip 和 rstrip 等字符串方法。

所以我想我正在寻求关于如何保持将文件内容作为字符串进行操作的灵活性的逻辑建议,但也能够在需要时将字符串中的行定位为特定的行操作,如上面的示例所示。

4

2 回答 2

2

使用 a for-loop,文件对象上的 for 循环一次返回一行。

#use `with` statement for handling files, it automatically closes the file for you.
with open('file.html') as fo, open('file1.html', 'w') as fo1:
   for line in fo:                   #reads one line at a time, memory efficient
      #do something with line, line.strip()
      fo1.write(line + '\n')              #write line to to fo1

如果您尝试修改同一个文件,请使用fileinput模块:

import fileinput
for line in fileinput.input('file.html', inplace = True):
   #do something with line
   print line  #writes the line back to 'file.html'

您也可以从中获取单独的行file.read(),使用以下方法将其拆分:

fo_as_string = fo.read()
lines = fo_as_string.splitlines()

但是file.read()将整个文件加载到内存中,因此内存效率并不高。

其他替代方法是f.readlines()and list(f),它们都返回文件对象中所有行的列表。

于 2013-06-23T06:58:22.013 回答
0

根据文件的大小以及您要对每一行执行的过程,有几个答案可能对您有用。

首先,如果您打算在处理文件时将整个文件保存在内存中,则可以将其保存为行列表,处理部分或全部行,并在您希望编写时使用标准行分隔符重新加入它们它们到磁盘:

linesep = '\n'
with open('file.html', 'r') as fin:
    input_lines = fin.readlines()


# Do your per-line transformation
modified_lines = [line.lstrip() for line in input_lines]

# Join the lines into one string to do whole-string processing
whole_string = linesep.join(modified_lines)

# whatever full-string processing you're looking for, do here

# Write to disk
with open('file1.html', 'w') as output_file:
    output_file.write(whole_string)

或者您可以指定自己的行分隔符,并手动进行输入解析:

linesep = '\n'
input_lines_by_hand = fin.read.split(linesep)
于 2013-06-23T07:11:59.070 回答