2013-06-12 240 views
0

我正在運行Python 2.7。我對Python很陌生。我正在嘗試讀取CSV文件(值由空格分隔),並根據座標上方的標題分隔內部值。該文件的格式不是我習慣的,我無法正確讀取值。即使我能讓他們正確閱讀,我也不知道如何將它們放入列表中。使用Python讀取CSV文件2

下面是CSV文件的樣子:

# image name 
1.png 
# probe locations 
100 100 
200 100 
100 200 
300 300 

# another image name 
2.png 
100 200 
200 100 
300 300 
135 322 

# end 

這裏是我與打碼:

class CommentedFile: 
    def __init__(self, f, commentstring="#"): 
     self.f = f 
     self.commentstring = commentstring 
    def next(self): 
     line = self.f.next() 
     while line.startswith(self.commentstring): 
      line = self.f.next() 
     return line 
    def __iter__(self): 
     return self 

#I did this in order to ignore the comments in the CSV file 

tsv_file = csv.reader(CommentedFile(open("test.exp", "rb")), 
        delimiter=' ') 


for row in tsv_file: 
    if row != int: 
     next(tsv_file) 
    if row: 
     print row 

代碼打印出:

['100', '100'] 
['100', '200'] 
['100', '200'] 
['300', '300'] 
Traceback (most recent call last): 
    File "the path", line 57, in <module> 
next(tsv_file) 
StopIteration 

所以我m試圖讓程序根據標題分開座標,然後將它們放入單獨的列表中。感謝您的幫助!

+1

那不是真的* * CSV文件,所以它可能不適合使用'CSV .reader'。示例輸入文件需要的輸出是什麼? – Aya

+0

我不明白行'if row!= int:'??? –

+0

我最終希望使用reader/parser的輸出作爲我正在繪製的圖形的座標。所以我想,列表中的x和y座標與它們在輸出中的方式一起。我應該用什麼來代替csv.reader? – user2479054

回答

0

看看pandas。它有一個可以保存你的數據並允許你以直觀的方式進行操作的對象。它還有一個read_csv函數,它在處理csv文件時可以省去很多麻煩。

例如:

import pandas as pd 

#reads your csv file in and returns a DataFrame object as metioned above. 
df = pd.read_csv("your_csv.csv", sep=' ', names=['co_a','co_b'], header=None, skiprows=2) 

#extracts your discordant to separate lists 
list1 = df.co_a.to_list() 
list2 = df.co_b.to_list() 

可以使用dfdf.head()看到你的數據的數據幀,以及如何管理。還值得一提的是,df.co_a是一個Series對象,認爲超級列表/字典,你可以從那裏做你的分析或操縱。

此外,如果您向我展示csv文件中的評論如何,我可以告訴你如何用read_csv忽略它們。

我知道你一直在尋找csv module的答案,但這是一個更先進的工具,從長遠來看可能會幫助你。

希望它有幫助!

+0

謝謝!該CSV文件看起來*完全*就像它在我問的問題。評論遵循標籤(#)。 CSV文件在座標上沒有標題。有什麼辦法可以按他們的列號對它們進行排序嗎?或者我需要標題?我無法真正改變CSV文件的格式。 – user2479054

+0

列號是好的,但它可能是值得添加簡單名稱的列,我會更新我的答案。 – agconti

+0

也可以將這兩個png列表分隔成不同的文件。兩者都不會正確導入數據框。如果你除了數字之外的任何東西都會被刪除,那麼使用上面的代碼會很好。 – agconti

0

你的代碼實際上對我很好。我不知道你爲什麼得到回溯。

tmp.csv

# image name 
1.png 
# probe locations 
100 100 
200 100 
100 200 
300 300 

# another image name 
2.png 
100 200 
200 100 
300 300 
135 322 

# end 

tmp.py

import csv 

class CommentedFile: 
    def __init__(self, f, commentstring="#"): 
     self.f = f 
     self.commentstring = commentstring 
    def next(self): 
     line = self.f.next() 
     while line.startswith(self.commentstring): 
      line = self.f.next() 
     return line 
    def __iter__(self): 
     return self 

#I did this in order to ignore the comments in the CSV file 

tsv_file = csv.reader(CommentedFile(open("tmp.csv", "rb")), 
        delimiter=' ') 


for row in tsv_file: 
    if row != int: 
     next(tsv_file) 
    if row: 
     print row 

殼牌輸出

tmp$python tmp.py 
['1.png'] 
['200', '100'] 
['300', '300'] 
['2.png'] 
['200', '100'] 
['135', '322'] 
tmp$uname -mprsv 
Darwin 12.4.0 Darwin Kernel Version 12.4.0: Wed May 1 17:57:12 PDT 2013; root:xnu-2050.24.15~1/RELEASE_X86_64 x86_64 i386 
tmp$python --version 
Python 2.7.2