1

我是python的新手,我正在尝试编写一个脚本,该脚本从文件(名为'peaks.dat')中读取一组x,y坐标并将它们填充到一个列表(类类型)中;我正在定义以下内容:

class point():
    def _init_(self,x=None,y=None,k=None,f=None):
        self.x=0    # x coordinate
        self.y=0    # y coordinate
        self.k=0    # I need these for later stuff
        self.f=-1   # I need these for later stuff

但是后来我找不到任何方法从文件中的一行(即仅来自两列之一的元素)中“选择”单个元素,而不是整行。有这样的事吗?

无论如何,我尝试将列拆分为两个不同的文件 x.dat 和 y.dat,但是我完全不知道如何从文件中分别填充我的“点”类型列表的 x 和 y 字段。我试过了

f=open('x.dat','r')
mylist=[]
for line in f:
    mylist.append(point(line, , , )) # wrong syntax D:
f.close()

for data in mylist:
    print i.x

计划稍后对 y.dat 文件进行相同的处理,但在许多层面上似乎都是错误的。

ps我来自一些C++,如果你想举个例子。

编辑: peaks.dat 只是三列(我只需要前两列)数字,比如

1.2   1.6   0.4
1.5   2.1   0.3
1.1   1.0   0.5

等等

x.dat(或 y.dat)是单行数字。

4

3 回答 3

5

根据文件的格式,您要么想使用csv模块,要么使用str.split()函数。

对于一行上的空格分隔值,请使用str.split()

points = []

with open(inputfilename) as infile:
    for line in infile:
        row = [int(i) for i in line.split()]
        # row is now a list of integers.
        points.append(point(*row))

对于其他格式,通常csv模块是最佳选择:

import csv

points = []

with open(inputfilename, 'rb') as infile:
    reader = csv.reader(infile, delimiter='\t')  # tab delimited file
    for row in reader:
        row = [int(i) for i in row]
        # row is now a list of integers.
        points.append(point(*row))

要仅读取两行,请使用next()两次;.csv 版本:

    for _ in range(2):
        row = [int(i) for i in next(reader)]
        # row is now a list of integers.
        points.append(point(*row))

next()从迭代器中获取下一项;infileobject 和object都是reader产生文件行或 CSV 行的迭代器。

或者,使用itertools.islice()实用程序

for row in islice(reader, 2):  # only yield the first two rows.
于 2013-06-17T13:26:44.847 回答
2

用于str.split分割一行数据,str.split返回一个字符串列表。

例子:

>>> strs = "1.2   1.6   0.4"
>>> strs.split()
['1.2', '1.6', '0.4']
#use slicing as you need only first two items
>>> [float(x) for x in strs.split()[:2]] 
[1.2, 1.6]

如果您只想要每行的前两列:

mylist=[]
with open('x.dat') as f:
   for line in f:
       #apply int to the items of `str.split` to convert them into integers
       x, y = [float(z) for z in line.split()[:2]]
       mylist.append(Point(x, y))

如果您只想读取前两行:

mylist=[]
with open('x.dat') as f:
   rows = 2
   for _ in xrange(rows):
       line = next(f)
       x, y, k = [float(z) for z in line.split()]
       mylist.append(Point(x, y, k))

对类定义的一些更改:

class point():
   def __init__(self,x = None,y =None,k =None,f =None):
      self.x = 0 if x is None else x  #assign default value only if the value was not passed
      self.y = 0 if y is None else y
      self.k = 0 if k is None else k
      self.f = -1 if f is None else f
于 2013-06-17T13:26:58.163 回答
0

这取决于文件的格式。坐标是否用逗号分隔?如果是这样,那么。

with open('x.dat','r') as f:
    mylist=[]
    for line in f:
        points = line.split(",")
        mylist.append(point(int(points[0]), int(points[1]), int(points[2]),int(points[3]))) 

我确信有一种更好、更 Pythonic 的方式来做到这一点。

您可以在http://effbot.org/zone/python-with-statement.htm阅读有关 Python 的“与”的信息

如果我的答案不是您想要的,也许您可​​以在这里找到有用的东西,http://docs.python.org/3/library/io.html#module-io 。

于 2013-06-17T13:29:55.633 回答