【问题标题】:Python: C engine does not support regex separatorsPython:C 引擎不支持正则表达式分隔符
【发布时间】:2015-12-18 16:54:59
【问题描述】:

尝试将一堆 csv 上传到数据库。 csv 不一定总是用逗号分隔,所以我使用正则表达式来确保使用正确的分隔符。然后我添加了

error_bad_lines=False

为了处理 CParserError:错误标记数据。 C 错误:第 127 行中预期有 3 个字段,看到 4 这导致我收到此错误

ValueError: Falling back to the 'python' engine because the 'c' engine does not support regex separators, but this causes 'error_bad_lines' to be ignored as it is not supported by the 'python' engine. 

以下代码

有解决办法吗?

import psycopg2
import pandas as pd
import sqlalchemy as sa
csvList = []
tableList = []
filenames = find_csv_filenames(directory)
for name in filenames:  
    lhs, rhs = str(name).split(".", 1)
    print name
    dataRaw = pd.read_csv(name,sep=";|,",chunksize=5000000, error_bad_lines=False)
    for chunk in dataRaw:
        chunk.to_sql(name = str(lhs),if_exists='append',con=con) 

【问题讨论】:

  • 您的数据是什么样的?如果您的字段并不总是用逗号分隔,那么它就不是真正的 CSV。你也许可以一起破解一些东西,但如果即使使用正则表达式分隔符也不能让你始终如一地提取字段,听起来你可能超出了 CSV 解析器的处理范围。
  • 据我所知,这些字段用逗号和分号分隔。我可以手动进入每个文件并一次上传一个,但我已经失去了编程的目的
  • 您能更改这些文件吗?如果是,您可以预处理您的文件并将; 更改为,,例如使用python re.sub 或linux sed
  • 我想我可以这样做,一些文件在加载到内存时出现问题,它们有 30 列 5500 万行之类的东西,而且它似乎很快就炸毁了我的 32GB RAM。生病调查 re.sub
  • 您可以逐行执行并创建另一个干净的文件(如果您有足够的存储空间来存储它)。使用that 问题的答案。

标签: python regex pandas


【解决方案1】:

根据此链接中的熊猫参数Pandas-link 如果分隔符多于一个字符,则需要将引擎参数添加为 'python'

试试这个,

dataRaw = pd.read_csv(name,sep=";|,",engine ='python',chunksize=5000000,
error_bad_lines=False)

【讨论】:

  • 我不明白为什么这被否决了。好答案
【解决方案2】:

如果您可以预处理和更改文件,请尝试将 ; 分隔符更改为 , 以生成干净的 csv 文件。你可以用fileinput 来改变它:

import fileinput

for line in fileinput.FileInput('your_file', inplace=True):
    line = line.replace(';', ',')
    print(line, end='')
fileinput.close()

然后您可以将read_csvc 引擎一起使用并使用参数error_bad_lines,或者您也可以使用该循环对它们进行预处理。

注意:如果您想备份您的文件,您可以使用 backup 参数作为 FileInput

【讨论】:

    猜你喜欢
    • 2010-09-28
    • 1970-01-01
    • 2020-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多