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

时间:2010-03-05 03:03:12

标签: python-3.x

我是Python的新手,只是抓住它来完成任务,并感谢一些帮助(Python 3.1)。

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

我可以解决以下两种方式之一:

  1. 以二进制模式而不是文本打开文件。问题在于我不能为我的生活弄清楚如何让writerow()对二进制文件起作用 - 我有很多例外。

  2. 第二个(更简单)解决方案是将所有“\ r \ n \ n \ n”替换为“\ r \ n”。

  3. 然而,在我的尝试中,我遇到了这些错误:

    一个。不先关闭文件,搜索和替换只会添加更多的“\ r \ n \ 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()
    

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

5 个答案:

答案 0 :(得分:4)

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

所以我只是这么做 - 大口一口气,除非文件可怕的巨大(gigabyte-plus):

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)

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

在Python 3.1中,

编辑我们需要在这里处理bytes个实例,不是字符串,因为这些文件是二进制文件。因此,根据the docswrite来电必须成为

  f.write(data.replace(b'\r\r\n', b'\r\n'))

那些b前缀告诉Python我们正在处理bytes,而不是str

答案 1 :(得分:1)

此外,您使用\ r \ n \ n \ n \ n时出现的问题可能是由于您在Windows平台上以及在文本模式下打开文件而不是以二进制模式打开文件。

我遇到了这个问题,并在Python 2 CSV writer produces wrong line terminator on Windows

找到了答案

答案 2 :(得分:0)

试试这个:

fileR = open(outputFile, "r")
text = fileR.read().replace("\r\r\n", "\r\n")
fileR.close()
fileW = open(outputFile, "wb")
fileW.write(text)
fileW.close()

答案 3 :(得分:0)

我对文件处理中的特殊情况并不太熟悉。但是,由于您提到您正在处理CSV文件(可以使用excel打开),我建议您查看pyExcelerator

希望这有帮助

答案 4 :(得分:0)

要正确编写CSV文件而不是在事后更正它们,请参阅此问题: Python3: writing csv files