0

我正在运行 Python 2.7。我对 Python 很陌生。我正在尝试读取一个 CSV 文件(值由空格分隔)并根据坐标上方的标题分隔内部的值。文件的格式不是我习惯的格式,我无法正确读取这些值。即使我能让它们正确阅读,我也不明白如何将它们放入列表中。

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

所以我试图让程序根据标题分离坐标,然后将它们放入单独的列表中。谢谢您的帮助!

4

2 回答 2

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

临时文件

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
于 2013-06-12T16:14:21.070 回答
0

看看熊猫。它有一个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()

您可以使用dfdf.head()查看您的数据框以及数据的管理方式。还值得一提的是,它df.co_a是一个Series对象,想想超级列表/字典,您可能可以直接从那里进行分析或操作。

此外,如果您向我展示文件中的注释csv,我可以向您展示如何使用read_csv.

我知道您正在寻找答案,csv module但这是一个更高级的工具,从长远来看可能会对您有所帮助。

希望能帮助到你!

于 2013-06-12T16:11:45.557 回答