【问题标题】:Parsing a text file with tweets to csv with '|' delimiter使用“|”将带有推文的文本文件解析为 csv分隔符
【发布时间】:2019-12-18 15:59:30
【问题描述】:

我有一个包含地理标记推文的 .txt 文件。信息由“|”分隔特点。信息(可以被视为列)是日期时间、纬度、经度和 tweet_text。

Date_time|latitude|longitude|tweet_text
Mon Jan 01 09:09:57 +0000 2018|-37.8140362|144.9644232|terima kasih 2017 yang ohsem. semoga 2018 akan lebih baik lagi.-selamat tahun baru rakan-rakan… 
Mon Jan 01 09:15:54 +0000 2018|-37.81639|144.9655|we love christmas and new year proposals! happy new year to everyone celebrating love this year… 
Mon Jan 01 09:42:08 +0000 2018|-37.818|144.985|@michaelpaynter entertaining everyone at yarra park nye event #melbourne| #nye #music… 
Mon Jan 01 09:45:16 +0000 2018|-37.818|144.985|@emilyurbandiva and brother @jwilliamsimusik entertaining everyone at yarra park nye eventâ€|¦

最初,我使用了

data = pd.read_csv('MelbCBD_scs2018_new.txt',sep="|", header=None)

,但只要 tweet_text 有“|”,它就会引发解析错误。

我尝试手动清理 tweet_text,但对于大文件来说工作量太大。因此我更改了 read_csv 的参数参数。

data = pd.read_csv('MelbCBD_scs2018_new.txt',sep="|", header=None, quoting=csv.QUOTE_NONE,error_bad_lines=False)

但它会显示以下警告并跳过我不想要的那些行(基本上是推文)。

b'Skipping line 340: expected 4 fields, saw 5

理想情况下,我希望在遇到 3 '|' 后删除任何特殊字符的代码.txt 文件的每一行中的字符,即 tweet_text 列,并将其解析为 .csv 文件,不跳过任何行。

【问题讨论】:

  • 我会(个人)把它分成两部分,第一部分是你的实际问题,然后简单地将数据重新写入一个新文件。然后你就可以正常阅读了。该|在推文中意味着它不完全是 |分隔文件---我知道这对你来说不是新闻,但我认为你的问题应该是如何更正你的分隔文件。在这种情况下,为什么不写一个替换分隔符的脚本呢?
  • 感谢您的反馈。你能推荐一个确定不会出现在 tweet_text 中的分隔符吗?
  • 其实最好的办法就是在文本周围加上引号;带引号的字符串内的管道不会被假定为分隔符。例如类似于 1.0,1.1,"hello, wold","etc" 的 CSV 行将解析为四列,而不是 5 列。或者,您可以将分隔符替换为 ASCII 分隔符——这些是键盘上没有的不可打印字符,因此不太可能出现在一条推文。 ascii 字符 28-31 保留用于不同的分隔符。
  • 感谢您的想法。我会试试的。但是有没有一种解决方案,我可以在开头指定列数,以便代码不考虑任何'|'在第三个之后作为分隔符。
  • @alkasm 关于引用您的数据的建议是最好的长期解决方案。在带有嵌入分隔符的分隔文件字段中应被引用。这是所有分隔文件解析器的非常标准的规则。确保您的数据文件是一个正确引用的分隔文件,这将最大限度地确保它得到正确处理,即使处理它的程序需要更改。

标签: python pandas csv parsing text


【解决方案1】:

所以只需要通过指定列名来指定列数。

data = pd.read_csv('MelbCBD_scs2018_new.txt', sep="|", names = ["Date_time", "latitude", "longitude","tweet_text"], header=None, quoting=csv.QUOTE_NONE,error_bad_lines=False)

现在,这将返回每一行而不跳过并将其存储在名为“数据”的数据框中。

【讨论】:

  • 酷!我想过这个解决方案,但不确定它是否可行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多