微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

通过忽略字段外壳引号 (" ") 中的 "LF" 和 "CR LF" 将 csv 读入数据帧

如何解决通过忽略字段外壳引号 (" ") 中的 "LF" 和 "CR LF" 将 csv 读入数据帧

我有一个数据文件,其中的字段用双引号和字段分隔符括起来,如下所示:

field enclosure = "<field_value>"
sep = ||@@##

所以字段值在引号内的文本具有 'LF' 和 'CR LF' 行分隔符,这导致下一行打印在新行上 - 这可能会被误解为新记录,当在事实上,它是一个记录的一部分,没有打破行转移到新行。

示例:

3||@@##14||@@##"2016-01-13 19:59:27"||@@##"2016-01-15 23:09:19"||@@##1162||@@##822||@@##1237||@@##\N||@@##"VHiujdfYshv"||@@##"---<LF>
...LF
"||@@##\N||@@##"2016-01-15 23:09:18"||@@##0||@@##1||@@##0||@@##0||@@##3||@@##1788||@@##\N||@@##205||@@##\N||@@##0||@@##\N||@@##\N||@@##\N||@@##\N||@@##\N||@@##\N||@@##1||@@##\N||@@##"251 Bgegf BHVcvytd Street<CR LF>
JHbsdbfh,RF 35214<CR LF>
<CR LF>
xyz@gmail.dhg.com<CR LF>
<CR LF>
@@##1788<LF>
4||@@##14||@@##"2016-01-25 22:08:53"||@@##"2016-02-15 20:32:08"||@@##1097||@@##933||@@##1262||@@##\N||@@##"VHiujdfYshv"||@@##"--- <LF>
...<LF>

请注意,LFCR LF 实际上没有尖括号,这可能是给定的,但我提到它是为了绝对清楚。下面是它在记事本++文件上的外观的片段。另请注意,我的数据包含 '||@@##' 作为字段分隔符,'\N' 表示 na_values。

以下是我目前阅读此文件的方式。我尝试使用 pd.read_csv 中的“quotechar”和“quoting”参数,但它使用了 C 解析器,其中分隔符使用 Python 解析器,因此 python 解析器被覆盖。我如何读取这个文件

df =  pd.read_csv(z.open(filename),encoding = 'utf8',header=None,sep='\|\|@@##',na_values='\\N',engine = 'python')

enter image description here

解决方法

你可以使用

rx_lbr = r'[\r\n\x0B\x0C\u0085\u2028\u2029]+'
with open(filepath,'r',newline="\n",encoding="utf-8") as fr:
  with open(savefilepath,'w',encoding="utf-8") as fw:
    fw.write( re.sub(r'"[^"]*"',lambda x: re.sub(rx_lbr,'',x.group()),fr.read()) )

带有 "[^"]*"re.sub 正则表达式匹配单引号之间的所有非重叠子字符串,而 lambda x: re.sub(rx_lbr,x.group()) 替换仅从匹配中删除所有垂直空白 Unicode 字符。因此,所有其他换行符保持不变。

Python demo

import re
content = r"""3||@@##14||@@##"2016-01-13 19:59:27"||@@##"2016-01-15 23:09:19"||@@##1162||@@##822||@@##1237||@@##\N||@@##"VHiujdfYshv"||@@##"---
...
"||@@##\N||@@##"2016-01-15 23:09:18"||@@##0||@@##1||@@##0||@@##0||@@##3||@@##1788||@@##\N||@@##205||@@##\N||@@##0||@@##\N||@@##\N||@@##\N||@@##\N||@@##\N||@@##\N||@@##1||@@##\N||@@##"251 Bgegf BHVcvytd Street
JHbsdbfh,RF 35214
 
xyz@gmail.dhg.com
 
@@##1788
4||@@##14||@@##"2016-01-25 22:08:53"||@@##"2016-02-15 20:32:08"||@@##1097||@@##933||@@##1262||@@##\N||@@##"VHiujdfYshv"||@@##"---
"""
print( re.sub(r'"[^"]*"',lambda x: re.sub(r'[\r\n\x0B\x0C\u0085\u2028\u2029]+',content) )

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。