【问题标题】:writing a string from one very long file to another file in python在python中将字符串从一个非常长的文件写入另一个文件
【发布时间】:2017-03-01 04:53:43
【问题描述】:

请不要因为我的菜鸟问题而斩首我。我在 stackoverflow 上查找了许多关于此主题的其他问题,但没有找到按预期工作的解决方案。

问题: 我有一个相当大的 txt 文件(大约 5 MB),我想通过 readlines() 或任何其他内置的字符串处理函数将其复制到一个新文件中。对于较小的文件,以下代码确实有效(此处仅示意性编码):

f = open('C:/.../old.txt', 'r');
n = open('C:/.../new.txt', 'w');
for line in f:
    print(line, file=n);

但是,正如我在这里 (UnicodeDecodeError: 'charmap' codec can't encode character X at position Y: character maps to undefined) 发现的那样,Windows 的内部限制禁止它处理更大的文件。到目前为止,我想出的唯一解决方案如下:

f = open('C:/.../old.txt', 'r', encoding='utf8', errors='ignore');
n = open('C:/.../new.txt', 'a');
for line in f:
    print(line, file=sys.stderr) and append(line, file='C:/.../new.txt');   

f.close();
n.close();

但这不起作用。我确实得到了一个 new.txt 文件,但它是空的。那么,如何遍历一个长的 txt 文件并将每一行写入一个新的 txt 文件?有没有办法读取 sys.stderr 作为新文件的源(我实际上不知道这个 sys.stderr 是什么)? 我知道这是一个菜鸟问题,但我不知道在哪里寻找答案了。

提前致谢!

【问题讨论】:

  • print(line, file=sys.stderr) and append(line, file='C:/.../new.txt') 该语句的第二部分永远不会被执行,因为print() 不会返回任何被解释为None 或上下文False 的内容。

标签: python


【解决方案1】:

文件不需要使用print(),只需write()即可:

with open('C:/.../old.txt', 'r') as f, open('C:/.../new.txt', 'w') as n:
    n.writelines(f)

但是,听起来您可能遇到了编码问题,因此请确保使用正确的编码打开这两个文件。如果您提供错误输出,也许可以提供更多帮助。

顺便说一句:Python 不使用; 作为行终止符,如果你想将它们放在同一行上,它可以用来分隔两条语句,但这通常被认为是错误的形式。

【讨论】:

  • 是的,可能是编码问题。我得到“UnicodeDecodeError:'charmap'编解码器无法解码......”但是,我尝试了许多可能的编码,但没有一个有效。对不起使用; .可能在这里与java混淆了。 :D
  • 不写控制台还有这个问题吗?
  • 是的,无论如何,新文件都是空的。
【解决方案2】:

您可以像我的代码一样将标准输出设置为文件。 我用这个成功复制了 6MB 的文本文件。

import sys

bigoutput = open("bigcopy.txt", "w")
sys.stdout = bigoutput
with open("big.txt", "r") as biginput:
    for bigline in biginput.readlines():
        print(bigline.replace("\n", ""))
bigoutput.close()

【讨论】:

  • 不起作用。我仍然得到 UnicodeDecodeError。不过还是谢谢。不过,您的代码看起来应该可以工作。我认为这实际上可能是一个解码问题。
  • @hab 哦,很抱歉听到这个消息。如果你没关系,你可以上传你的文本文件,以便我给你一些建议吗?
【解决方案3】:

为什么不直接使用shutil 模块并复制文件?

【讨论】:

  • 我不仅想简单地复制 txt 文件,还想从数据中形成列表和表格。我想提出一个简单的分析工具作为起点。
【解决方案4】:

你可以试试这个对我有用的代码。

with open("file_path/../large_file.txt") as f:
    with open("file_path/../new_file", "wb") as new_f:
            new_f.writelines(f.readlines())
            new_f.close()
    f.close()

【讨论】:

  • 如果使用with open(),则无需关闭文件。
  • 与其他人提供的解决方案基本相同。但是为什么在写入新文件时使用“wb”?这不在 python 文档中。
  • 我使用“wb”来打开二进制文件,因为我没有在我的代码中使用任何特定的文件扩展名,它可能是文本文件或任何二进制文件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-01-16
  • 2012-12-04
  • 2013-04-09
  • 2019-03-21
  • 1970-01-01
  • 2017-11-09
  • 1970-01-01
相关资源
最近更新 更多