【问题标题】:How to remove extra semicolons from the end of some lines in a txt如何从txt中某些行的末尾删除多余的分号
【发布时间】:2017-11-21 08:20:26
【问题描述】:

我是 stackoverflow 的新手,所以如果我的帖子没有正确发布或者您需要更多信息,请告诉我。所以我有一个非常奇怪的问题。我有一个 txt 文件,其中很多行由“;”分隔。通常应该有 42 个字段/列,但由于某种原因,我的 txt 文件中的某些行在导入并用“;”分隔时它向我显示了大量被跳过的行,因为 python“预期 42 个字段,看到 45 个”。我使用 pandas 导入文件,因为我的大部分转换都是用它完成的:

text = pd.read_csv('file.txt',encoding='ISO-8859-1', keep_default_na=False,error_bad_lines=False, sep=';')

我发现对于某些行,我有 3 个额外的“;”在末尾。因为大部分数据都是机密的,我不能在公司之外分享,所以我生成了一个类似的 3 行 txt 文件,向您展示我的问题所在。

;;;5123123;text1;text2;;;;123124;text3;text4;;;;5234234;text5;text6;;;;412321;text7;text8;;;;512312;text9;text10;;; ;15123213;text11;text12;;;;123123;text13;text14 ;;;4666190;text1;text2;;;;312312;text3;text4;;;;5123123;text5;text6;;;;;;;;;;;;;;;;;;;;;55123;文本7;文本8 ;;;5123123;text1;text2;;;;1321321;text3;text4;;;;123124;text5;text6;;;;;;;;;;;;;;;;;;;;;;3123123; 512312312;text7;;;

所以这些与我文件中的三行相似,但名称已替换。第一行和第二行是正确的,但第三行在导入时会产生 45 个字段。 那么有没有一种方法可以在导入文件之前浏览文件并查找以;;;5123123 开头的所有行并检查是否有“;”最后,如果有删除它们,然后当然导入它们。问题仅在于某些以;;;5123123 开头的行。这个错误有几百行,整个数据有一点点超过 50k 行。

【问题讨论】:

  • 这些数据是如何生成的?格式很难拆分,有什么办法可以对上游的输出进行排序吗?
  • 您好,它是每天从我运营的组织内的内部系统自动生成的。不幸的是,我认为在生成数据之前不可能解决问题。但如果我没记错的话,每一行都是有人手动输入到系统中的。

标签: python python-3.x pandas


【解决方案1】:

我相信 pd 是 pandas,所以你可以使用 usecols 参数作为 read_csv 方法

text = pd.read_csv('file.txt',
                   encoding='ISO-8859-1', 
                   keep_default_na=False,
                   error_bad_lines=False,
                   sep=';',
                   usecols=list(range(43)),
                   names=list(range(43)),
                   headers=None)

已编辑 您也可以添加namesheaders 参数

【讨论】:

  • 您好,您提供给我的代码给出了“ValueError:Usecols 与名称不匹配”。 .我要试试看能不能解决这个错误。
  • @soky 在这种情况下你可以使用names=list(range(43)) 参数
  • 实际上,由于某种原因,它现在可以在没有名称和标题部分的情况下工作,因为我想保留代码第一行的列名。十分感谢!我试图提高你的答案,但我的声望不到 15。
【解决方案2】:

您是否尝试过拆分为列表然后删除空白元素?

f = open('file.txt', 'rb')
raw_str = str(f.read())
full_list = raw_str.split(';')
templist = list(filter(None, full_list))

通过打印 templist 它给出了所有元素的列表。您可以根据您的要求使用 for 循环对其执行任何操作,例如再次转换为字符串。输出就像 -

【讨论】:

  • 这个问题是我需要那些空单元格(以“;;;5123123”开头的行除外,最后一个文本之后不需要空格)。很多行都会有一些列/单元格是空的,但也有很多行会有一些信息。我想保持每一行和它所拥有的列数之间的一致性。
猜你喜欢
  • 2021-05-23
  • 2019-04-28
  • 1970-01-01
  • 2016-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-26
相关资源
最近更新 更多