Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 使用Python替换\r\r\n“;加上\r\n“;在二进制文件中_Python 3.x - Fatal编程技术网

Python 3.x 使用Python替换\r\r\n“;加上\r\n“;在二进制文件中

Python 3.x 使用Python替换\r\r\n“;加上\r\n“;在二进制文件中,python-3.x,Python 3.x,我对Python非常陌生,只是通过爬行来完成一项任务,希望能得到一些帮助(Python3.1) 我有一个用DictWriter编写的CSV文件,方言是“excel”。创建文件后,我注意到文件中有多余的行,仔细检查,这是因为我在每行末尾都有“\r\n”而不是“\r\n” 我可以用两种方法之一解决这个问题: 以二进制模式而不是文本模式打开文件。问题是我一辈子都无法弄清楚如何让writerow()在二进制文件上工作——我遇到了大量异常 第二个(更简单的)解决方案是将所有“\r\r\n”替换为“\r\n

我对Python非常陌生,只是通过爬行来完成一项任务,希望能得到一些帮助(Python3.1)

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

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

  • 以二进制模式而不是文本模式打开文件。问题是我一辈子都无法弄清楚如何让writerow()在二进制文件上工作——我遇到了大量异常

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

  • 然而,在我的尝试中,我遇到了以下错误:

    a。不先关闭文件,搜索和替换只会添加更多的“\r\r\n”行。 B我已尝试先关闭文件,以二进制模式重新打开,并执行相同的搜索和替换,但我发现错误:

    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()
    

    将感谢任何人提供的任何帮助!

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

    因此,我只需一大口地这样做,除非文件非常大(GB以上):

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

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

      f.write(data.replace(b'\r\r\n', b'\r\n'))
    
    那些
    b
    前缀告诉Python我们处理的是
    字节,而不是
    str
    字符串。

    试试这个:

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

    我不太熟悉文件处理中的特殊情况。但是,既然您提到您正在处理CSV文件(可以用excel打开),我建议您浏览一下


    希望这有帮助

    此外,您遇到的问题\r\n可能是由于您在Windows平台上,并以文本模式而不是二进制模式打开文件造成的


    我遇到了这个问题,并在这里找到了答案

    要正确写入CSV文件,而不是事后更正,请参见此问题:

    我刚刚尝试了这个方法,但出现了这样的错误:“TypeError:需要一个具有缓冲区接口的对象”在这行:“f.write(data.replace('\r\n','\r\n'))”@TMC,你应该提到你正在使用Python3;)啊,Python3.1——我刚才在你的问题正文中注意到了它(它有一个特定的标签,因为几乎所有人都在使用的2.5/2.6版本和更新的3.1版本之间的正确答案经常有很大的差异)。解决方案是:--让我编辑答案以澄清。@gnibbler,他做了(在第一段末尾的括号中),只是不够明显,我没有注意到(理想情况下是作为标记;-)。我现在编辑了答案,以显示Python 3所需的微小更改。这也不起作用。当第二次以二进制文件(“b”标志)打开文件时,我在尝试写出新文本时出现此错误:“TypeError:必须是字节或缓冲区,而不是str”。我在没有二进制标志的情况下尝试了它(以文本形式打开)但我也遇到了同样的问题。每一行都是用\r\r\n而不是\r\n写出来的。有用的库很方便,但现在对我来说太麻烦了。我已经正确地写出了CSV文件,并且可以轻松地导入Excel。旁注:发生这种情况的原因是,您没有为
    .CSV
    文件调用
    打开
    使用
    newline=''
    (打开要与
    csv
    模块一起使用的文件的唯一正确方法)并且您在Windows上,使用类似Windows的方言
    csv
    csv。writer
    明确地编写了
    \r\n
    (因为所讨论的方言使用了
    \r\n
    作为换行符)并且,由于未能使用
    换行符=''
    禁用
    打开中的行结束转换,
    \n
    io.TextIOWrapper
    转换为
    \r\n
    ,使其位于磁盘上。
    fileR = open(outputFile, "r")
    text = fileR.read().replace("\r\r\n", "\r\n")
    fileR.close()
    fileW = open(outputFile, "wb")
    fileW.write(text)
    fileW.close()