使用Python将二进制文件中的“\r\r\n”替换为“\r\n”

TMC*_*TMC 4 python-3.x

我对 Python 非常陌生,只是通过它爬行以完成任务,并希望得到一些帮助(Python 3.1)。

我有一个用 DictWriter 编写的 CSV 文件,其方言为“excel”。创建文件后,我注意到文件中有多余的行,仔细检查是因为每行末尾都有“\r\r\n”而不是“\r\n”。

我可以通过以下两种方法之一解决这个问题:

  1. 以二进制模式而不是文本模式打开文件。问题在于,我终其一生都无法弄清楚如何让 writerow() 对二进制文件起作用——我得到了很多异常。

  2. 第二种(更简单的)解决方案只是用“\r\n”替换所有的“\r\r\n”。

但是,在我的尝试中,我遇到了以下错误:

一种。不先关闭文件,搜索和替换只会添加更多的“\r\r\n”行。湾 我已经尝试先关闭文件,以二进制模式重新打开并进行相同的搜索和替换,但我得到了错误:

WindowsError: [错误 32] 进程无法访问该文件,因为它正被另一个进程使用

这是代码:

#code before this writes to the final in text mode
myfile.close()
myfile = open(outputFile, "wb")
for line in fileinput.FileInput(outputFile, inplace=1):
    line = line.replace("\r\r\n", "\r\n")
    print (line)
myfile.close()
Run Code Online (Sandbox Code Playgroud)

任何人都可以提供任何帮助!

Ale*_*lli 5

更改文件的安全方法(除了附加,可以安全地就地完成)是将修改后的文件复制到新文件中,删除旧文件,像旧文件一样重命名新文件。这是避免灾难性错误和数据丢失的一种可靠方法。根据平台的不同,“删除旧的,重命名新的”步骤可能是原子性的,但这在 Windows 中很难,而且并不是那么重要。

所以我只是这样做 - 一大口,除非文件非常大(千兆字节以上):

with open(filename, 'rb') as f:
  data = f.read()
with open(newfilename, 'wb') as f:
  f.write(data.replace('\r\r\n', '\r\n'))
os.unlink(filename)
os.rename(newfilename, filename)
Run Code Online (Sandbox Code Playgroud)

您的代码的问题是二进制模式和文本模式之间的混淆——例如,您无法从二进制模式打开的文件中正确“读取一行”。

在 Python 3.1 中编辑我们需要在bytes这里处理实例,而不是字符串,因为文件是二进制文件。因此,根据文档write调用必须变为

  f.write(data.replace(b'\r\r\n', b'\r\n'))
Run Code Online (Sandbox Code Playgroud)

这些b前缀告诉 Python 我们正在处理的是bytes,而不是strings。