近日在处理数据的时候遇到一条记录内存在换行符"\n",记录结尾处以“\r\n”换行,如果不注意有可能读取过来按两条记录处理了。这种情况下,如何保证数据原样读取,另外为了避免因记录内存在换行符"\n"干扰数据应用,考虑将其删除。
读取数据
用open()函数读取数据,open(file, mode=‘r’, buffering=-1, encoding=None, errors=None, newline=None, closefd=True),经常使用参数说明:
- mode:打开文件的基本模式,取值有“r”(只读)、“w”(只写)、“a”(追加)等;
- encoding:表示返回的数据采用何种编码,如“utf-8”、“gbk”、“gb2312”、“gb18030”;
- errors:表示对错误的处理,取值一般有“strict”、“ignore”。当取“strict”的时候,字符编码出现问题的时候会报错;当取“ignore”的时候,编码出现问题,程序会忽略而过,继续执行下面的程序;
- newline:表示一行结束时的换行符,可以取的值有None、“\n”、“\r”、“\r\n”,但是这个参数只对文本模式有效。
newline参数可解决上面遇到的问题,首先看一下未设置newline参数时,即newline取默认值None,可以看到记录内存在换行符“\n”的都被处理成了两条。
num=0
for line in open('test.csv', mode='r'):
print("第"+str(num)+"条记录:")
print(line)
num+=1
为了保证数据的原样读取,需要明确一条记录的结束符,设置newline=’\r\n’,此时以’\r\n’为一条记录结束的换行符,可以看到记录内存在换行符“\n”的按一条记录处理了。
num=0
for line in open('test.csv', mode='r',newline='\r\n'):
print("第"+str(num)+"条记录:")
print(line)
num+=1
删除记录内的换行符
虽然设置一定的参数,可以保证正确读入数据,但是正确读取数据才是第一步,记录内换行符的存在有可能对后期的数据分析产生影响,为了避免干扰数据分析和建模,考虑将记录内的换行符删除。
- 当数据量比较小时
可以采用手动处理的方式,即在Notepad++中采用两次替换,“\n”(LF)替换成“”,然后再将“\r”(CR)替换成“\n”。
- 当数据量比较大时
当数据量太大时,很多文件都无法打开没办法进行手动替换,而且数据量太大时,手动替换也比较耗时,于是写程序自动处理,主要用到了split()、join()函数。
import pandas as pd
##读取数据并查看数据基本信息
file='test.csv' ##所在文件夹目录
data=pd.read_csv(file,encoding='gb18030',sep=None,delimiter=",",error_bad_lines=False)
columns=data.columns.tolist() ##获取字段
print(columns)
#print(data.info())
data.head()
result=[]
for i in data.values:
print("原数据",i.tolist()) ##按行打印原始数据
print("删除换行符后的数据:",[' '.join(str(j).split('\n')) for j in i]) ##按行打印删除掉'\n'的数据
result.append([' '.join(str(j).split('\n')) for j in i])
result_data=pd.DataFrame(result,columns=columns)
result_data.to_csv("result_data.csv",encoding='gb18030',index=False)
result_data.head()
附:完整代码和数据可通过以下链接自行下载。
链接:https://pan.baidu.com/s/1EDFxVx5BWnI6LU0EocDN9Q
提取码:x04x
ps:初衷是通过撰写博文记录自己所学所用,实现知识的梳理与积累;将其分享,希望能够帮到面临同样困惑的小伙伴儿。如发现博文中存在问题,欢迎随时交流~~