【问题标题】:Reading text file using read_csv with regex dilimiter使用带有正则表达式分隔符的 read_csv 读取文本文件
【发布时间】:2018-06-17 08:33:19
【问题描述】:

我一直在尝试使用 read_csv 读取文本文件 university_towns.txt,但如屏幕截图所示,在使用正则表达式分隔符解析文件时,如下代码所示,我收到以下错误:

ParserError: Expected 2 fields in line 89, see 3. 错误可能 是因为使用多字符分隔符时引号被忽略。

有什么办法可以解决这个问题,似乎只有一个地方的双引号有问题,还请解释为什么会这样?我也尝试使用 quotechar 参数,但不明白如何使用它。

我读取文件的代码如下:

university_towns = pd.read_csv('university_towns.txt', sep= "\s\(", engine='python', header=None)

university_towns.txt file image

Annville (Lebanon Valley College)[2]
Bethlehem (Lehigh University, Moravian College)
Bloomsburg (Bloomsburg University of Pennsylvania)[2]
Bradford (University of Pittsburgh at Bradford)
California (California University of Pennsylvania)[2]
Carlisle (Dickinson College)
Cecil B. Moore, Philadelphia, also known as "Templetown" (Temple University)
Clarion (Clarion University of Pennsylvania)[2]
Collegeville (Ursinus College)
Cresson (Mount Aloysius College)[2]
East Stroudsburg (East Stroudsburg University of Pennsylvania)[2]
Edinboro (Edinboro University of Pennsylvania)[2]
Erie (Gannon University, Mercyhurst College, Penn State Erie)
Gettysburg (Gettysburg College)[2]
Greensburg (Seton Hill University, University of Pittsburgh at Greensburg)
Grove City (Grove City College)[2]
Huntingdon (Juniata College)[2]
Indiana (Indiana University of Pennsylvania)[2]
Johnstown (University of Pittsburgh at Johnstown)
Kutztown (Kutztown University of Pennsylvania)[2]
Lancaster (Franklin & Marshall)
Carrollton (University of West Georgia)[2]*Dahlonega (North Georgia College & State University)[2]

我在上面粘贴了一些文本文件的行。另外,最后一行是第 89 行。

【问题讨论】:

  • 谢谢 - 但使用此文本我无法验证您的错误。哪一个是第 89 行?
  • 查看答案,将 2 个参数添加到您的 readcall 以获取有关坏行的输出并修复它们
  • 你的最后一行有两个(,这就是为什么 pd 想要使它成为 3 列而不是像所有其他行一样的 2 列。 - 看起来那条线应该是 2 条单独的线,一所大学用于西乔治亚州,一所大学用于 North G. & State

标签: python pandas


【解决方案1】:

您的文本样本不会重现该错误。您可以通过在调用中添加一些参数来提示导致错误的原因:

pd.read_csv('university_towns.txt', sep= "\s\(", 
            engine='python', header=None , 
            error_bad_lines= False, warn_bad_lines = True)

pandas.read_csv()


使用

# https://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_csv.html

import pandas as pd

with open( 'university_towns.txt', "w") as f:
    f.write("""Annville (Lebanon Valley College)[2]
Bethlehem (Lehigh University, Moravian College)
Bloomsburg (Bloomsburg University of Pennsylvania)[2]
Carrollton (University of West Georgia)[2]*Dahlonega (North Georgia College & State University)[2]""")

university_towns = pd.read_csv('university_towns.txt', sep= "\s\(", engine='python', header=None)

print(university_towns)

确实会重现您的错误。原因是最后一行(看起来应该是单独的行)包含 2 个匹配您的正则表达式,因此希望分成 3 列,而所有其他行只有 2 列。 => 错误。

要修复它,请将违规行拆分为 2:

Annville (Lebanon Valley College)[2]
Bethlehem (Lehigh University, Moravian College)
Bloomsburg (Bloomsburg University of Pennsylvania)[2]
Carrollton (University of West Georgia)[2]
Dahlonega (North Georgia College & State University)[2]

它会起作用的。

【讨论】:

  • 我能以任何方式阻止这种贪婪的分裂吗?所以,我只能在那一排有卡罗尔顿,其余的都被淘汰了,因为还有其他错误,例如:斯普林菲尔德(美国国际学院)、(斯普林菲尔德学院)和(西部新英格兰学院),我只想在这种情况下抓住斯普林菲尔德。
  • @aspiring1 我不知道。您可以指定 error_bad_lines= False 并忽略整行 - 但是您缺少 2 所大学。您可以指定 comment='*' 并且只松开 Dahlonega (No.. 部分 if 这是您文件中唯一有 '*' 的地方 - 但不会修复您的其他错误。您可以编写一个预处理脚本,在将其导入到 pandas 之前为您拆分行...
  • @aspiring1 您可以像这样调用 pandas:pd.read_csv('university_towns.txt', sep= "\s\(", engine='python', header=None, names=["1","2","3","4","5"]) ...这会将 NaN 填充到您的 df 中,因此任何行最多填充 5 个值,您必须丢弃之后你不喜欢的那些 - 虽然这不会解决“1 行中的 2 所大学”的情况
  • 是的,这个方法看起来不错,我可以在将数据导入数据框后删除其他列。另外,我很好奇为什么第 1 到第 4 列取 None 值而第 5 列取 NaN 作为值?
  • 我在 Carrollton Line 89 上得到了澄清:coursera.org/learn/python-data-analysis/discussions/weeks/4/… 并感谢所有答案最后一种方法可以解决我的问题,在课程讨论论坛中的另一种方法是使用分隔符阅读= "\n" 然后使用 str.split("(")[0]. 提取
【解决方案2】:

显示第 83 列,这里可以看到其他一些 - 我认为那里有两个 ( - \s\(。至少这就是此错误消息的含义。其他可能的问题是那里有奇怪的字符,解析器根本就丢失了。我认为大学名称不可能......无论如何 - 看看那条线。如果这不明显,请与我们分享。

【讨论】:

  • 我已经分享了第83行,这是正文的最后一行(我现在刚刚添加)
  • 问题是两行合并在一起。会不会是手动编辑的原因?
猜你喜欢
  • 1970-01-01
  • 2022-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-06
  • 2016-02-07
  • 1970-01-01
相关资源
最近更新 更多