代码之家  ›  专栏  ›  技术社区  ›  wierob

python 2 csv writer在Windows上生成错误的行终止符

  •  42
  • wierob  · 技术社区  · 15 年前

    根据 its documentation csv.writer默认情况下应使用'\r\n'作为行终止符。

    import csv
    
    with open("test.csv", "w") as f:
        writer = csv.writer(f)
    
        rows = [(0,1,2,3,4),
               (-0,-1,-2,-3,-4),
               ("a","b","c","d","e"),
               ("A","B","C","D","E")]           
    
        print writer.dialect.lineterminator.replace("\r", "\\r").replace("\n", "\\n")
        writer.writerows(rows)
        print writer.dialect.lineterminator.replace("\r", "\\r").replace("\n", "\\n")
    

    这张照片

    \r\n
    \r\n
    

    果不其然。但是,创建的csv文件使用了lineterminator'\r\r\n'

    0,1,2,3,4
    
    0,-1,-2,-3,-4
    
    a,b,c,d,e
    
    A,B,C,D,E
    

    这是一个bug还是我使用csv.writer时有什么问题?

    Python版本:

    ActivePython 2.6.2.2(活动状态 基于python 2.6.2的软件公司 (R262:71600,2009年4月21日,15:05:37) win32上的[msc v.1500 32位(intel)]。

    在Windows Vista上

    3 回复  |  直到 6 年前
        1
  •  63
  •   Blairg23 jfs    6 年前

    在python 2.x中,始终在 二元的 模式,如文件所示。 csv \r\n 正如您所期望的,但是基础的Windows文本文件机制会切入并更改 \n \rn …总效应: \r\r\n

    csv.writer 文档:

    如果 CSV文件 是一个文件对象,必须用 'b' 在有区别的平台上标记。

    对于说出罪魁祸首的名字似乎有些沉默:—)

    编辑:正如@jebob在对该答案的评论中提到的,基于@dave burton's answer ,要在python 2和3中处理此情况,应该执行以下操作:

    if sys.version_info >= (3,0,0):
        f = open(filename, 'w', newline='')
    else:
        f = open(filename, 'wb')
    
        2
  •  23
  •   Dave Burton    12 年前

    不幸的是,它与用于Python3的csv模块稍有不同,但此代码将同时适用于Python2和Python3:

    if sys.version_info >= (3,0,0):
        f = open(filename, 'w', newline='')
    else:
        f = open(filename, 'wb')
    
        3
  •  21
  •   Jason Callahan    9 年前

    要更改python 2.7csv编写器中的行终止符,请使用

    writer = csv.writer(f, delimiter = '|', lineterminator='\n')

    这是一种更简单的方法,可以将默认分隔符从\r\n更改为。