2010-06-16 130 views
3

我想讀一個非常簡單但在某種程度上使用python中的csv庫的大型(800Mb)csv文件。分隔符是單個選項卡,每行包含一些數字。 每一行是一個記錄,我有我的文件20681行。在使用此文件進行計算時,我遇到了一些問題,它總是停在某一行。我懷疑,在file.I使用下面的代碼來算這個文件行的數目行數:閱讀python中的csv文件的問題

tfdf_Reader = csv.reader(open('v2-host_tfdf_en.txt'),delimiter=' ') 
c = 0 
for row in tfdf_Reader: 
    c = c + 1 
print c 

令我驚訝的c的印有61722的價值!這是爲什麼發生?我究竟做錯了什麼?

+0

hello hello ...如果你已經解決了你的問題,接受一個答案或寫你自己的答案並接受它 - 否則你需要提供更多的信息,以便我們可以幫助你。 – 2010-06-18 00:40:31

+0

嗨,對不起,遲到的回覆。問題是,它被保存在Unix格式。所以我沒有選擇安裝Ubuntu並丟棄窗戶。 Noe一切都很好。我使用vim,看到長行導致了這個問題 順便說一句,感謝您的調試代碼,它幫助了我很多。我選擇它作爲答案,如果有人有同樣的問題可以使用它。 – Hossein 2010-06-18 15:04:39

+0

「問題在於它是以Unix格式保存的,所以我沒有選擇安裝Ubuntu並丟掉Windows。」 - 「以Unix格式保存」不應該成爲Python的問題;今後,在採取這種激烈行動之前,請考慮描述您的問題並尋求更多幫助。 – 2010-06-18 22:12:52

回答

2

文件中的8億字節和20681行意味着平均行大小超過38千字節。你確定嗎?你預計每行有多少個數字?你怎麼知道你有20681行?該文件是800 Mb?

61722行幾乎是完全的3倍20681 - 是任何意義數3例如每條記錄的3個邏輯子部分?

要了解您文件中的真實含義,請不要依賴它的外觀。 Python的repr()函數是你的朋友。

你在Windows?即使不,總是open(filename, 'rb')

如果這些字段是製表符分隔的,那麼不要把delimeter=" "(不管是引號之間的任何內容都不是製表符)。把delimiter="\t"

嘗試把一些調試語句,在代碼中,像這樣的:

DEBUG = True 
f = open('v2-host_tfdf_en.txt', 'rb') 
if DEBUG: 
    rawdata = f.read(200) 
    f.seek(0) 
    print 'rawdata', repr(rawdata) 
    # what is the delimiter between fields? between rows? 
tfdf_Reader = csv.reader(f,delimiter=' ') 
c = 0 
for row in tfdf_Reader: 
    c = c + 1 
    if DEBUG and c <= 10: 
     print "row", c, repr(row) 
     # Are you getting rows like you expect? 
print "rowcount", c 

注意:如果你正在Error: field larger than field limit (131072),這意味着你的文件有沒有分隔符的數據爲128Kb。

我會懷疑:

(一)你的文件有隨機的垃圾或apppended它二進制0的一大塊 - 這應該是顯而易見的十六進制編輯器;它也應該在TEXT編輯器中顯而易見。打印您所做的所有行,以幫助確定故障發生的位置。

或(b)分隔符是一個或多個空格字符(空格,製表符)的字符串,前幾行有製表符,其餘行有空格。如果是的話,這應該是一個十六進制編輯器明顯(或記事本+ +,特別是如果你做View/Show Symbol/Show all characters)。如果是這種情況,你不能使用csv,你需要一些簡單的東西:

f = open('v2-host_tfdf_en.txt', 'r') # NOT 'rb' 
rows = [line.split() for line in f] 
+0

我不願意說「#NOT'rb'」 – Arafangion 2010-06-17 00:00:47

0

我的第一個猜測將是分隔符。你如何確保分隔符是一個製表符? 什麼是真正要傳遞的價值? (你的代碼列出了一個空格,但我相信你打算通過別的東西)。

如果您的文件是製表符分隔的,那麼請專門查找'\ t'作爲您的分隔符。尋找一個空間會搞砸你的數據中不存在空格的情況,而不是列分隔符。

此外,如果您的文件是一個excel選項卡,那麼有一個特殊的「方言」。

+0

我實際上是通過查看數據來說明的。我看到我的價值觀之間有一個空間。 – Hossein 2010-06-16 21:41:49

+0

你如何看待你的數據?用十六進制編輯器或只是通過文本編輯器?文本編輯器可能無法正確顯示選項卡。用notpad ++編寫的 – Uri 2010-06-16 21:43:22

+0

。我使用了'\ t',但是在多行之後它給了我這個錯誤:Traceback(最近一次調用最後一次): 文件「C:\ Users \ Hossein \ Documents \ UvA Study Materials \ ECML \ Codes \ TFIDFMaker \ TFIDFgenerator.py」 43行,在 process_tf_idf() 文件 「C:\用戶\侯賽因\文件\阿姆斯特丹大學的研究材料\ ECML \代碼\ TFIDFMaker \ TFIDFgenerator.py」,第21行,在process_tf_idf 爲行中tfdf_Reader: 錯誤:字段大於字段限制(131072) – Hossein 2010-06-16 21:45:44