使用 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
。
【问题讨论】:
你真的不应该在文本文件中混用CRLF
和 LF
。使用一个,或另一个。您的输入文件实际上已经损坏。如果您为其创建此文件的系统由于某种原因无法处理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