在Python 3或2.7中,从包含数百万条记录的大型CSV文件中删除不需要的不可打印字符

在Python 3或2.7中,从包含数百万条记录的大型CSV文件中删除不需要的不可打印字符,python,pandas,csv,non-printing-characters,Python,Pandas,Csv,Non Printing Characters,我收到以(逗号或|或^)分隔的大型CSV文件,其中包含数百万条记录。 有些字段具有不可打印的字符,如CR | LF,翻译为字段结尾。这是在windows10中 我需要编写python来遍历文件并删除字段中的CR | LF。但是,我不能全部删除,因为这样会合并行 我已经浏览了一些关于如何删除不可打印内容的帖子。我想写一个panda数据帧,然后检查每个字段的CR | LF并删除它。这似乎有点复杂。如果你有一个快速的代码如何做到这一点,这将是很大的帮助 提前谢谢 示例文件: record1, 111.

我收到以(逗号或|或^)分隔的大型CSV文件,其中包含数百万条记录。
有些字段具有不可打印的字符,如CR | LF,翻译为字段结尾。这是在windows10中

我需要编写python来遍历文件并删除字段中的CR | LF。但是,我不能全部删除,因为这样会合并行

我已经浏览了一些关于如何删除不可打印内容的帖子。我想写一个panda数据帧,然后检查每个字段的CR | LF并删除它。这似乎有点复杂。如果你有一个快速的代码如何做到这一点,这将是很大的帮助

提前谢谢

示例文件:

record1, 111. texta, textb CR|LF
record2, 111. teCR|LF
xta, textb CR|LF
record3, 111. texta, textb CR|LF
示例输出文件应为:

record1, 111. texta, textb CR|LF
record2, 111. texta, textb CR|LF
record3, 111. texta, textb CR|LF
CR=车厢返回=x0d LF=换行=x0a

编辑——9月18日星期三,23:46 UTC+2 注意:

record1|111. texta|textb|111CR|LF
record2|111. teCR|LF 
xta|text|111CR|LF
record3|111. texta|textb|111CR|LF
这是我们要分析的文件


由于我们有一个csv文件,我们可以非常确定给定列的行之间的数据类型是一致的

基于此假设,我们可以使用regexp(
\\\\\d+CR\\\\LF
)在范围(
CL | RF
)中regexp分隔符

如果regexp不匹配,我们可以删除回车符,因为这不是行的结尾

将熊猫作为pd导入
从io导入StringIO
进口稀土
#验证模式“任意数+CR”是否正确`
pattern=re.compile(“\\\d+CR\\LF”)
#打开文件并读取内容
将open(“a.txt”)作为f:
数据=f.读线()
未解析=data.copy()
_最大值=长度(数据)
i=0
解析的_数据=[]
#迭代数据
而我<\u max:
#删除不必要的新行
line=数据[i].strip()
#如果图案不匹配,我们需要剥去车厢返回
如果不是模式。搜索(线)和i+1最大值:
行=行。替换(“CR | LF”和“).strip()
line=line+data[i+1].strip()
i+=1
直线
如果行!="":
解析的_数据。追加(行)
i+=1
#评论
data=[line.replace(“CR | LF”和“”)用于解析的_数据中的行]
#使用熊猫加载csv
打印(“数据在->{}.format(“.join(未解析)))
打印(“数据现在->{}”.format(“\n”.join(数据)))
DATA=StringIO(“\n”.连接(数据))
df=pd.read_csv(数据,分隔符=“|”)

如何去除不需要的CL | RF,但留下想要的

该文件将不会被修改,而是保存为单个列表(“逐行”)。 然后,我们将仅在regexp不匹配并作为数据帧加载时替换回车符

注:
在使用
\n
作为
新行的
Linux
上测试

在您的文件上运行此脚本(例如,将其命名为
fix_csv.py
),以对其进行清理:

#!/usr/bin/env python3

import sys
import os

if len(sys.argv) < 3:
    sys.stderr.write('Please give the input filename and an output filename.\n')
    sys.exit(1)

# set the correct number of fields
nf = 3
# set the delimiter
delim = ','

inpf = sys.argv[1]
outf = sys.argv[2]

newline = os.linesep

with open(inpf, 'r') as inf, open(outf, 'w') as of:
    cache = []
    for line in inf:
        line = line.strip()
        ls = line.split(delim)
        if len(ls) < nf or cache:
            if not cache:
                cache = cache + ls
            elif cache:
                cache[-1] += ls[0]
                cache = cache + ls[1:]
            if len(cache) == nf:
                of.write(f'{delim}'.join(cache) + newline)
                cache = []
        else:
            of.write(line + newline)
输出:

record1, 111. texta, textb
record2, 111. texta, textb
record3, 111. texta, textb

在什么基础上决定删除哪些不可打印字符?此时,我需要删除CR | LF和所有\xx0(\xa0、\xb0、\xc0……)Unicodedata您如何判断要删除哪个CR | LF?修复任何程序编写的垃圾输出可能更值得。是
111。texta
真的只有一个字段吗?这如何删除不需要的CL | RF,但留下想要的?呃,对不起,先生!我完全没有抓住要点!请上传几行。我认为在这种情况下,我们必须针对特定目的调整算法。我们可以根据“\\\d+CR\\\LF”regexp选择替换或不替换“CR | LF”。用字符串而不是数字作为文件的例子让我感到困惑:D.请上传几行代码以验证3255 | 8 | 2 | 24582 | 1 | 11826 41st,迪金森| 1 | 39 | 15855 | Y | 559 | 2018-10-15 10:13:33.000 | 890 | 2019 02-15 10:54:56.000 12482 |斯塔克