在python中使用带有read_csv()的正则表达式分隔符?

时间:2016-06-08 22:50:02

标签: python regex separator

我有很多的csv文件格式化:

date1::tweet1::location1::language1

date2::tweet2::location2::language2

date3::tweet3::location3::language3

等等。一些文件包含多达200 000条推文。我想提取4个字段并将它们放在pandas数据帧中,以及计算推文的数量。这是我现在使用的代码:

try:
    data = pd.read_csv(tweets_data_path, sep="::", header = None, engine='python')
    data.columns = ["timestamp", "tweet", "location", "lang"]
    print 'Number of tweets: ' + str(len(data))

except BaseException, e :
    print 'Error: ',str(e)

我收到了以下错误

Error: expected 4 fields in line 4581, saw 5

我尝试设置error_bad_lines = False,手动删除导致程序错误的行,将nrows设置为较低的数字..然后仍然得到那些"期望的字段"随机线的错误。假设我删除了文件的下半部分,我将得到相同的错误但是对于第1787行。由于之前处理正确,因此对我没有意义。目视检查csv文件并不能显示突然出现在有缺陷的线路中的突出模式。

日期字段和推文包含冒号,网址等等,所以也许正则表达式会有意义吗?

有人可以帮我弄清楚我做错了什么吗?非常感谢提前!

以下要求的数据样本:

Fri Apr 22 21:41:03 +0000 2016::RT @TalOfer: Barack Obama: Brexit would put UK back of the queue for trade talks [short url] #EuRef #StrongerIn::United Kingdom::en

Fri Apr 22 21:41:07 +0000 2016::RT @JamieRoss7: It must be awful to strongly believe in Brexit and be watching your campaigns make an absolute horse's arse of it.::The United Kingdom::en

Fri Apr 22 21:41:07 +0000 2016::Whether or not it rains on June 23rd will  have more influence on the vote than Obama's lunch with the Queen and LiGA with George. #brexit.::Dublin, Ireland::en

Fri Apr 22 21:41:08 +0000 2016::FINANCIAL TIMES FRONT PAGE: 'Obama warns Brexit vote would send UK to 'back of trade queue' #skypapers [short url]::Mardan, Pakistan::en

2 个答案:

答案 0 :(得分:0)

您是否尝试过read_table?我之前尝试使用read_csv时出现了这种错误,并且通过使用它解决了问题。请参阅此post,这可能会为您提供有关如何解决错误的一些想法。也许还可以尝试sep=r":{2}"作为分隔符。

答案 1 :(得分:0)

从这开始:

pd.read_csv(tweets_data_path, sep="::", header = None, usecols = [0,1,2,3])

上面应该有4列,然后你可以弄清楚丢弃了多少行,以及数据是否有意义。

使用此模式:

data["lang"].unique()

因为,你有数据问题,而不是它的位置。您需要退后一步并使用python&#csv reader'。这应该让你开始。

import csv
reader = csv.reader(tweets_data_path)
tweetList = []
for row in reader:
    try:  
        tweetList.append(  (row[0].split('::')) )
    except BaseException, e :
        print 'Error: ',str(e)

print tweetList

tweetsDf =   pd.DataFrame(tweetList)



print tweetsDf
                                   0  \
    0   Fri Apr 22 21:41:03 +0000 2016   
    1   Fri Apr 22 21:41:07 +0000 2016   
    2   Fri Apr 22 21:41:07 +0000 2016   
    3   Fri Apr 22 21:41:08 +0000 2016   

                                                       1                   2     3  
0  RT @TalOfer: Barack Obama: Brexit would put UK...      United Kingdom    en  
1  RT @JamieRoss7: It must be awful to strongly b...  The United Kingdom    en  
2  Whether or not it rains on June 23rd will  hav...              Dublin  None  
3  FINANCIAL TIMES FRONT PAGE: 'Obama warns Brexi...              Mardan  None