Python 2.7 - pandas.read_table - 如何从平面文件导入 quadruple-pipe-separated 字段
Python 2.7 - pandas.read_table - how to import quadruple-pipe-separated fields from flat file
我是一个不错的 SAS 程序员,但我对 Python 还是个新手。现在,我得到了 Twitter 提要,每个提要都保存在 非常大的 平面文件中,第 1 行中有 headers,数据结构如下所示:
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
Tue Nov 14 12:33:00 +0000 2017||||930413253766791168||||ICYMI: Football clubs join the craft beer revolution! A good read|||| ||||BAB||||BABBrewers||||Monthly homebrew meet-up at 1000 Trades, Jewellery Quarter. First Tuesday of the month. All welcome, even if you've never brewed before.||||95|||| ||||0||||0||||0||||0
Tue Nov 14 12:34:00 +0000 2017||||930413253766821456||||I'm up for it|||| ||||Misty||||MistyGrl||||You CAN DO it!||||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 行中的每一行,直到换行符,忽略 ||||分隔器。
基本上,我得到的输出与我上面写的一样,用于向您展示数据结构。
有什么提示吗?
仅使用您问题中的数据:
>>> 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='\|\|\|\|'
;但是,我使用了缩写。
我是一个不错的 SAS 程序员,但我对 Python 还是个新手。现在,我得到了 Twitter 提要,每个提要都保存在 非常大的 平面文件中,第 1 行中有 headers,数据结构如下所示:
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 Tue Nov 14 12:33:00 +0000 2017||||930413253766791168||||ICYMI: Football clubs join the craft beer revolution! A good read|||| ||||BAB||||BABBrewers||||Monthly homebrew meet-up at 1000 Trades, Jewellery Quarter. First Tuesday of the month. All welcome, even if you've never brewed before.||||95|||| ||||0||||0||||0||||0 Tue Nov 14 12:34:00 +0000 2017||||930413253766821456||||I'm up for it|||| ||||Misty||||MistyGrl||||You CAN DO it!||||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 行中的每一行,直到换行符,忽略 ||||分隔器。
基本上,我得到的输出与我上面写的一样,用于向您展示数据结构。
有什么提示吗?
仅使用您问题中的数据:
>>> 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='\|\|\|\|'
;但是,我使用了缩写。