当使用CSV模块将行解析为CSV文件时,如果字段文本中存在\n,则这将在生成的CSV文件中创建换行符. 请考虑以下代码:

import csv

field_names=['id', 'number', 'scope']

data_rows=[
{'id': 100001, 'number': 'a01', 'scope': 'row1 test \n\nrow1 test\n\nrow1 test'},
{'id': 100002, 'number': 'a02', 'scope': 'row2 test \n\nrow2 test\n\nrow2 test'}
]

tbl_name= 'testnewlines'

with open(tbl_name+'.csv','w', newline='',  encoding='utf-8') as f:
    writer=csv.DictWriter(f,fieldnames=field_names,delimiter='|')
    writer.writeheader()
    for d_row in data_rows:
        writer.writerow(d_row)

生成的CSV文件如下所示

id|number|scope
100001|a01|"row1 test 

row1 test

row1 test"
100002|a02|"row2 test 

row2 test

row2 test"

如果\n包含在带引号的文本中,如何避免在CSV文件中创建换行符? 在模块文档https://docs.python.org/3/library/csv.html的脚注中 建议使用newline=‘’,但不适用于我.

推荐答案

创建的文件是有效的CSV文件-解析器应该能够在找到换行符时识别出一对引号是打开的.

如果您希望避免使用普通的、非CSV感知的文本编辑器来查看这些字符,则必须对换行符进行转义,以便将数据输出从实际的换行符(带有十进制值10(\x0a\n)的单个字节)转换为两个可打印的字符序列:\n(带有十进制值92和110的两个字节)-或您 Select 的任何其他序列.

在Python端,这只需通过一个str.place调用即可实现.然而,尽管您将在相同的"物理TXT数据行"中看到CSV数据行,但以类似的方式,稍后将该文件作为数据read的应用程序(如Electron 表格或其他Python脚本)将不会将这些序列识别为"换行符":在读取之后,您将不得不再次将它们替换为换行符(或者只是保留修改后的数据并使用它).

tbl_name= 'testnewlines'

with open(tbl_name+'.csv','w', newline='',  encoding='utf-8') as f:
    writer=csv.DictWriter(f,fieldnames=field_names,delimiter='|')
    writer.writeheader()
    for d_row in data_rows:
        # the next three lines could be written as a comprehension.
        # I am unwinding them for clarity
        new_row = {}
        for key, value in data_rows.items():
            new_row[key] = value.replace("\n", "\\n")  if isinstance(value, str) else value
            # "\\n" escapes the "\" itself so it is a literal "\" 
            # character, and not a character escaping the "n"
        writer.writerow(new_row)

换句话说,这将创建一个使用文本编辑器看起来更整洁的文件,但不会为往返保留记录的数据:它将需要在阅读后自定义步骤来undo撤消此替换.

Python相关问答推荐

是pandas.DataFrame使用方法查询后仍然排序吗?

在Python中为变量的缺失值创建虚拟值

计算所有前面行(当前行)中列的值

Class_weight参数不影响RandomForestClassifier不平衡数据集中的结果

在内部列表上滚动窗口

对整个 pyramid 进行分组与对 pyramid 列子集进行分组

无法使用requests或Selenium抓取一个href链接

Python解析整数格式说明符的规则?

如何使用表达式将字符串解压缩到Polars DataFrame中的多个列中?

在np数组上实现无重叠的二维滑动窗口

利用Selenium和Beautiful Soup实现Web抓取JavaScript表

不允许访问非IPM文件夹

isinstance()在使用dill.dump和dill.load后,对列表中包含的对象失败

如何使用使用来自其他列的值的公式更新一个rabrame列?

如何检测鼠标/键盘的空闲时间,而不是其他输入设备?

找到相对于列表索引的当前最大值列表""

导入错误:无法导入名称';操作';

具有相同图例 colored颜色 和标签的堆叠子图

Python pint将1/华氏度转换为1/摄氏度°°

如何在Python中从html页面中提取html链接?