2013-06-12 2 views
0

저는 Python 2.7을 사용하고 있습니다. 나는 Python을 처음 접했을 뿐이다. CSV 파일 (값은 공백으로 구분됨)을 읽고 좌표 위의 머리글을 기준으로 값을 분리하려고합니다. 파일 형식은 필자가 익숙한 것이 아니며 값을 올바르게 읽는 데 문제가 있습니다. 비록 내가 올바르게 읽을 수 있다고해도, 나는 그것을 어떻게 목록에 넣는 지 이해하지 못합니다.Python 2를 사용하여 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("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 

그래서 내가 '여기

# 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 

내가 함께 연주하고있는 코드입니다 : 여기

은 CSV 파일의 모습입니다 프로그램이 헤더를 기반으로 좌표를 분리하고 별도의 목록에 넣으려고하는 중입니다. 도와 줘서 고마워!

+1

'CSV를 .reader'. 예제 입력 파일에서 원하는 출력은 무엇입니까? – Aya

+0

'if row! = int :'줄을 이해할 수 없습니까? ??? –

+0

필자는 드로잉 할 그래픽의 좌표로 독자/파서의 출력을 사용하고 싶습니다. 그래서리스트는 x와 y 좌표가 함께 출력되는 방식을 함께 생각합니다. csv.reader 대신 무엇을 사용해야합니까? – user2479054

답변

0

pandas을 살펴보십시오. 그것에는 DataFrame 자료가 들어있어 직관적 인 방법으로 조작 할 수 있습니다. 또한 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() 

당신이 당신의 데이터를 관리하여 dataframe과 방식을 볼 수 df 또는 df.head()를 사용할 수 있습니다. df.co_aSeries 개체라는 것을 언급 할 가치가 있으며, 수퍼 목록/dict를 생각해보십시오. 아마도 거기에서 분석이나 조작을 할 수 있습니다.

또한 내 의견을 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 

쉘 출력이 사용하는 아마 적절하지 그래서 * 정말 * CSV 파일이 아닙니다

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