【问题标题】:Better approach for reading/writing files in python?在 python 中读取/写入文件的更好方法?
【发布时间】:2013-03-20 13:13:23
【问题描述】:

假设我有一个文件(比如file1.txt),其中包含大约 3mb 或更多的数据。如果我想将此数据写入第二个文件(比如file2.txt),以下哪种方法会更好?

使用的语言:Python 2.7.3

方法一

file1_handler = file("file1.txt", 'r')
for lines in file1_handler:
    line = lines.strip()
    # Perform some operation
    file2_handler = file("file2.txt", 'a')
    file2_handler.write(line)
    file2_handler.write('\r\n')
    file2_handler.close()
file1_handler.close()

方法2

file1_handler = file("file1.txt", 'r')
file2_handler = file("file2.txt", 'a')
for lines in file1_handler:
    line = lines.strip()
    # Perform some operation
    file2_handler.write(line)
    file2_handler.write('\r\n')
file2_handler.close()
file1_handler.close()

我认为方法二会更好,因为您只需打开和关闭file2.txt 一次。你说什么?

【问题讨论】:

  • open打开文件,而不是file

标签: python file-handling


【解决方案1】:

使用with,它会自动为你关闭文件:

with open("file1.txt", 'r') as in_file, open("file2.txt", 'a') as out_file:
    for lines in in_file:
        line = lines.strip()
        # Perform some operation
        out_file.write(line)
        out_file.write('\r\n')

使用open 代替filefile 已弃用。

当然在file1的每一行都打开file2是不合理的。

【讨论】:

  • 我在写同样的想法 :) @Hemant,看看:docs.python.org/2/whatsnew/2.5.html#pep-343-the-with-statement
  • 关于 f2.write('\r\n'):为此,您需要将 f2 作为二进制文件打开(将“b”附加到标志位)。
  • 哎呀!我认为 open 已被弃用:p (我没有正确阅读文档)所以写入速度会提高吗?因为方法一复制 1 MB 数据需要将近 2 个小时。
  • 二进制模式对 Unix 没有影响。它写了它被告知要写的东西。
  • Windows 上的文本模式将\r\n 转换为\r\n\r\n 保持不变。
【解决方案2】:

我最近也在做类似的事情(如果我理解你的话)。怎么样:

file = open('file1.txt', 'r')
file2 = open('file2.txt', 'wt')

for line in file:
  newLine = line.strip()

  # You can do your operation here on newLine

  file2.write(newLine)
  file2.write('\r\n')

file.close()
file2.close()

这种方法很有效!

【讨论】:

    【解决方案3】:

    我的解决方案(源自 Pavel Anossov + 缓冲):

    dim = 1000
    buffer = []
    with open("file1.txt", 'r') as in_file, open("file2.txt", 'a') as out_file:
        for i, lines in enumerate(in_file):
            line = lines.strip()
            # Perform some operation
            buffer.append(line)
            if i%dim == dim-1:
                for bline in buffer:
                    out_file.write(bline)
                    out_file.write('\r\n')
                buffer = []
    

    Pavel Anossov 首先给出了正确的解决方案:这只是一个建议;) 可能它存在一种更优雅的方式来实现这个功能。如果有人知道,请告诉我们。

    【讨论】:

    • @Francesco:嘿,谢谢你的回答 :) 但我对枚举方法不太熟悉。请解释一下使用枚举的好处?
    • @Hemant:枚举很有用 :) 看这里:docs.python.org/2/library/functions.html#enumerate
    • @Francesco:谢谢你的文档。现在我更清楚地理解了你的例子。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-15
    • 2012-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-02
    • 1970-01-01
    相关资源
    最近更新 更多