2014-02-09 24 views
0
import argparse 
import gzip 
import dateutil.parser 
import sys 


def main(): 
userID = "UserID" 
previous_timestamp = "2000-01-01 00:00:00" 
t_value = 0 


parser = argparse.ArgumentParser() 
# deze regel is nodig om de file als een argument mee te geven 

parser.add_argument("file") # file als argument 

parser.add_argument("-t", action="store_true") # argument om te kijken of er wordt voldaan aan de threshold van 1800 seconden 

parser.add_argument("-threshold") # een variable threshold, die standaard ook 1800 seconden is. 

args = parser.parse_args() 

f = gzip.open(args.file, 'rb') # open van de file vanuit een gzip formaat. 



content = f.read().splitlines() # het uitlezen van de file en het splitten van de lines 

for line in content: 
    words = line.split("\t") 
    ID = words[0] 

    if not userID == ID: #als de userID's niet hetzelfde zijn, dan een --- lijn printen 
     print '---------------------------------------' 
     print line 
     userID = ID 
    else: 
     print line 

    if args.t or args.threshold: # als de gebruiker wil kijken naar patronen met behulp van een tijdthreshold 
     if args.threshold: 
      t_value = args.threshold 
    else: 
     t_value = 1800 # standaard threshold waarden 

    t_value = int(t_value) 

    timestamp = words[2] 

    time_difference = dateutil.parser.parse(timestamp) - dateutil.parser.parse(previous_timestamp) # tijdverschil tussen queries berekenen 
    if time_difference.seconds >= t_value: # als het verschil groter is dan de threshold, komt er een enter tussen 
     print "\n" 
     print line 





f.close() 

if __name__ == "__main__": 
    main() 

我得到的錯誤Dateutil解析器類型錯誤

TypeError: 'NoneType' object is not iterable 

完整回溯是:

Traceback (most recent call last): 
    File "opdracht1_2.py", line 68, in <module> 
    main() 
    File "opdracht1_2.py", line 54, in main 
    time_difference = dateutil.parser.parse(timestamp) - dateutil.parser.parse(previous_timestamp) # tijdverschil tussen queries berekenen 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/python_dateutil-2.2-py2.7.egg/dateutil/parser.py", line 748, in parse 
    return DEFAULTPARSER.parse(timestr, **kwargs) 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/python_dateutil-2.2-py2.7.egg/dateutil/parser.py", line 310, in parse 
    res, skipped_tokens = self._parse(timestr, **kwargs) 
TypeError: 'NoneType' object is not iterable 

任何想法如何解決這個問題?

+2

我們可以看到異常的* full * traceback嗎?有沒有可能'詞[2]'是*空*? –

+0

添加追蹤:) – user3289867

+0

Dank!你還可以添加一個'print'語句來顯示'timestamp'和'previous_timestamp'具有什麼值?只需在'dateutil.parser.parse()'行之前添加'print repr(timestamp),repr(previous_timestamp)';在回溯之前添加最後一個輸出到您的文章。 –

回答

1

您需要跳過文件的第一行,它有一個標題。

使用csv模塊讀取數據更有效,而不是讀這一切到內存在一次:

import csv 

with gzip.open(args.file, 'rb') as f: 
    reader = csv.reader(f, delimiter='\t') 
    next(reader, None) # skip first row of the file; negeer de eerste regel 

    for words in reader: 
     words = line.split("\t") 

reader使用next()迭代從文件中讀取,這是我們忽略了一條線。如果文件中沒有行,函數將返回默認值None