【问题标题】:CSV Writer (Python) with CRLF instead of LF使用 CRLF 而不是 LF 的 CSV Writer (Python)
【发布时间】: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 结尾的单元格中的空白行:)

标签: python csv csvreader csvwriter


【解决方案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 而不做任何其他事情就会在另一点上自找麻烦。
猜你喜欢
  • 1970-01-01
  • 2011-06-18
  • 1970-01-01
  • 1970-01-01
  • 2015-04-24
  • 2021-09-06
  • 2014-07-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多