现有一个贼鸡儿大的文件,想要用 pandas 读取,文件是个是 str|str|str|str|str,用 pandas.read_table(path,header=None,sep='|')进行读取,但是文件里有一些脏数据,比如 str 中含有这|字符,所以用读取的时候老是异常,很蛋疼所以写了函数,进行处理,但是感觉好像有点蠢,各位大手子有没有什么别的方法。
这个是处理异常的函数,文件有 4 个多 G,用我这种方式要读到猴年马月了
def read_file(path):
flag = True
ignore_lines = []
while flag:
try:
data = pd.read_table(path, header=None, sep='|', skiprows=ignore_lines)
except Exception as e:
error_line = re.search(r'line (\d+)', e.__str__()).group(1)
ignore_lines.append(int(error_line))
else:
flag = Flase
return data
1
vinceguo 2018-05-19 12:57:33 +08:00 via Android
先把脏数据处理掉吧。先把分隔符个数不对的行挑出来写到别的地方,正确的行写到另一个地方
|
2
alexfu 2018-05-19 13:29:42 +08:00
awk -F"|" 'NF==5{print}' file.txt
可以用 subprocess 直接在 python 里读取结果 |
3
RicardoScofileld OP @vinceguo 主要数据量很大,百万条级别的。
|
4
RicardoScofileld OP @alexfu 是要对数据进行运算的
|
5
jowuIM 2018-05-19 14:04:05 +08:00
只能先对数据格式进行处理吧, 也就是把脏数据处理掉. 百万条但是却有 4G, 单挑数据应该不小.
|
6
jssyxzy 2018-05-19 15:06:13 +08:00
感觉应该先处理;
另外数据太大不考虑文件切割开来, 多开几个程序来读? |
7
vinceguo 2018-05-19 15:32:06 +08:00 via Android
4G 数据能有多大。随便搞搞就好了。要相信电脑的速度
|
8
zzj0311 2018-05-19 15:40:42 +08:00 via Android
4g。。内存都不虚你虚什么
|
9
airqj 2018-05-19 16:04:58 +08:00
这么点数据用脚本处理再 pandas
|
10
RicardoScofileld OP @vinceguo 靠,文件 4g,读到内存都不止啊,我用 ipython,试着读取,直接进程都崩了
|
11
RicardoScofileld OP @airqj 处理个中间文件,在 pandas ?
|
12
alexfu 2018-05-19 16:43:37 +08:00
@RicardoScofileld 先用 awk 处理再读进 pandas 啊
|
13
kuhung 2018-05-19 16:46:25 +08:00
字符问题要考虑下怎么预处理。pandas 读大一点儿的数据,chunk 了解一下。
|
14
alexfu 2018-05-19 16:49:30 +08:00
@RicardoScofileld 文件切分也可以直接一步做了 `awk -F"|" 'NF==5 && NR%5==1{print}' file.txt ` 这是 5 份中取一份
|
15
janxin 2018-05-19 17:05:08 +08:00 via iPad
pandas 如果不做处理,你这种纯字符串文件读出来的内存大小肯定是大于 4G,崩溃看一下是不是 oom,oom 那就是你能用的内存不够了呀
你要做的不是 pandas 读的时候异常就再来一次,因为你的方法会不停尝试 load,建议你最好预处理数据即可,不要尝试反复 load,内存没释放最后也是 oom 了 |