使用 CRLF 而不是 LF 的 CSV Writer (Python)

Posted

技术标签:

【中文标题】使用 CRLF 而不是 LF 的 CSV Writer (Python)【英文标题】:CSV Writer (Python) with CRLF instead of LF 【发布时间】:2022-01-22 21:16:58 【问题描述】:

您好,我正在尝试使用 csv 库将我的 CSV 文件转换为新文件。

我写的代码如下:

import csv
import re

file_read=r'C:\Users\Comarch\Desktop\Test.csv'
file_write=r'C:\Users\Comarch\Desktop\Test_new.csv'

def find_txt_in_parentheses(cell_txt):
    pattern = r'\(.+\)'
    return set(re.findall(pattern, cell_txt))

with open(file_write, 'w', encoding='utf-8-sig') as file_w:
    csv_writer = csv.writer(file_w, lineterminator="\n")
    with open(file_read, 'r',encoding='utf-8-sig') as file_r:
        csv_reader = csv.reader(file_r)
        for row in csv_reader:
            cell_txt = row[0]
            txt_in_parentheses = find_txt_in_parentheses(cell_txt)
            if len(txt_in_parentheses) == 1:
                txt_in_parentheses = txt_in_parentheses.pop()
                cell_txt_new = cell_txt.replace(' ' + txt_in_parentheses,'')
                cell_txt_new = txt_in_parentheses + '\n' + cell_txt_new
                row[0] = cell_txt_new
            csv_writer.writerow(row)

唯一的问题是在结果文件(Test_new.csv 文件)中,我有CRLF 而不是LF。 这是一个示例图像:

读取左侧文件 右侧写入文件:

因此,当我将 csv 列复制到 Google docs Excel 文件中时,每行后面都有一个空行,带有 CRLF

是否可以使用csv 库编写我的代码,以便将LF 留在单元格中而不是CRLF

【问题讨论】:

真的不应该在文本文件中混用 CRLFLF。使用一个,或另一个。您的输入文件实际上已经损坏。如果您为其创建此文件的系统由于某种原因无法处理CRLF,那么您最好的选择可能是一直使用LF @Tomalak 问题是我没有混合它。这是我在将文件保存为 CSV 文件后从 Microsoft Excel 中得到的。 有趣,我从来不知道!但我可以重现它,Excel 也只为我保存LF。更改后留在CRLF会造成什么麻烦? (Excel 本身不会被它弄糊涂,它对我来说打开两个文件都很好。) @Tomalak 我已经编辑了问题并添加了我在 Google Docs Excel 中得到的内容的屏幕。每行以CRLF 结尾的单元格中的空白行:) 【参考方案1】:

来自documentation of csv.reader

如果csvfile是一个文件对象,应该用newline=''打开它1 [...]

脚注

1(1,2) 如果未指定newline='',则不会正确解释嵌入在引用字段中的换行符,并且在使用\r\n linendings 的平台上将添加额外的\r。指定newline='' 应该始终是安全的,因为 csv 模块自己(通用)换行处理。

这正是您所看到的问题。所以...

with open(file_read, 'r', encoding='utf-8-sig', newline='') as file_r, \
     open(file_write, 'w', encoding='utf-8-sig', newline='') as file_w:
     
    csv_reader = csv.reader(file_r, dialect='excel')
    csv_writer = csv.writer(file_w, dialect='excel')

    # ...

【讨论】:

非常感谢!我在这个网站上,但我没有进入页面的最底部,这就是我错过这部分的原因。学到了新的一课:阅读文档直到最后:) @JohnSnow 我只是养成了总是用newline='' 打开 CSV 文件的习惯,但我从未完全意识到为什么。现在我明白了。 :) 所以我们互相帮助了:)这很好:)【参考方案2】:

您在 Windows 上,并以“w”模式打开文件——这为您提供了 Windows 样式的行尾。使用模式“wb”应该会给你首选的行为。

【讨论】:

wb 意味着 OP 必须手动处理文本编码,因此只需切换到 wb 而不做任何其他事情就会在另一点上自找麻烦。

以上是关于使用 CRLF 而不是 LF 的 CSV Writer (Python)的主要内容,如果未能解决你的问题,请参考以下文章

Perl MIME::Tools - CRLF 更改为 LF

Git将图像中的CRLF转换为LF

notepad++替换CRLF为LF

带有 CRLF 和 LF 文件的 Git 存储库?

Windows下Git使用报错:warning:LF will be replaced by CRLF in

CR LF、LF 和 CR 换行符类型的区别?