【问题标题】:Python 2.7 - pandas.read_table - how to import quadruple-pipe-separated fields from flat filePython 2.7 - pandas.read_table - 如何从平面文件导入四管道分隔字段
【发布时间】:2018-05-29 21:36:18
【问题描述】:

我是一个不错的 SAS 程序员,但我对 Python 还是很陌生。现在,我收到了 Twitter 提要,每个提要都保存在 非常大 平面文件中,标题位于第 1 行,数据结构如下:

CREATED_AT||||ID||||TEXT||||IN_REPLY_TO_USER_ID||||NAME||||SCREEN_NAME||||DESCRIPTION||||FOLLOWERS_COUNT||||TIME_ZONE||||QUOTE_COUNT|||| REPLY_COUNT||||RETWEET_COUNT||||FAVORITE_COUNT 2017 年 11 月 14 日星期二 12:33:00 +0000||||930413253766791168||||ICYMI:足球俱乐部加入精酿啤酒革命!好好读书|||| ||||BAB||||BABBrewers||||在珠宝区 1000 Trades 举行的每月自制聚会。每个月的第一个星期二。欢迎大家,即使您以前从未酿造过。||||95|||| ||||0||||0||||0||||0 2017 年 11 月 14 日星期二 12:34:00 +0000||||930413253766821456||||我准备好了|||| ||||Misty||||MistyGrl||||你可以做到!||||45|||| ||||0||||0||||0||||0

我想是这样的,因为任何类型的字符都可以在 Twitter 提要中找到,但四重管道不太可能。

我知道有些人为此使用 JSON,但我有这些文件:很多。我可以使用 SAS 轻松转换这些文件,但这次我更喜欢“go pythonic”。

现在,我似乎找不到让 Python (2.7) 理解四重管道是实际分隔符的方法。以下代码的输出:

import pandas as pd

with open('C:/Users/myname.mysurname/Desktop/my_twitter_flow_1.txt') as theInFile:
    inTbl = pd.read_table(theInFile, engine='python', sep='||||', header=1)
    print inTbl.head()

似乎表明 Python 不会将不同的字段视为不同的,而是简单地引入前 5 行中的每一行,直到换行符,忽略 ||||分隔器。

基本上,我得到的输出与我上面写的一样,用于向您展示数据结构。

有什么提示吗?

【问题讨论】:

  • 顺便说一句:如果你是 Python 新手,你可能不应该从像 2.7 这样过时的版本开始。

标签: python pandas separator


【解决方案1】:

仅使用问题中的数据:

>>> df = pd.read_csv('rio.txt', sep='\|{4}', skip_blank_lines=True, engine='python')
>>> df
                       CREATED_AT                  ID  \
0  Tue Nov 14 12:33:00 +0000 2017  930413253766791168   
1  Tue Nov 14 12:34:00 +0000 2017  930413253766821456   

                                                TEXT IN_REPLY_TO_USER_ID  \
0  ICYMI: Football clubs join the craft beer revo...                       
1                                      I'm up for it                       

    NAME SCREEN_NAME                                        DESCRIPTION  \
0    BAB  BABBrewers  Monthly homebrew meet-up at 1000 Trades, Jewel...   
1  Misty    MistyGrl                                     You CAN DO it!   

   FOLLOWERS_COUNT TIME_ZONE  QUOTE_COUNT  REPLY_COUNT  RETWEET_COUNT  \
0               95                      0            0              0   
1               45                      0            0              0   

   FAVORITE_COUNT  
0               0  
1               0  

注意sep 参数。当它的长度超过一个字符且不等于 '\s+' 时,它被解释为正则表达式。但是'|'字符在正则表达式中具有特殊含义,因此必须使用“\”字符对其进行转义。我可以简单地写sep='\|\|\|\|';但是,我使用了缩写。

【讨论】:

  • 非常简洁的答案! +1
  • @MaxU:非常感谢!
  • 谢谢你,@BillBell...! :-)
  • @RioPugliese:不客气。如果它符合您的要求,您可以将答案标记为已接受。
猜你喜欢
  • 1970-01-01
  • 2011-01-22
  • 2010-09-17
  • 1970-01-01
  • 2012-02-19
  • 1970-01-01
  • 2020-11-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多