现有一个贼鸡儿大的文件,想要用 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 了 |