Python 将文件写入元组列表
我试图读取一个文件并将其内容写入元组列表。每个元组的长度是2,列表的长度是可变的,这取决于我们从哪个文件读取。每个元组应表示x,y平面上的一个点,第一个值为x坐标,第二个值为y坐标。我遇到的问题是,我认为for循环是实现这一点的最佳方法,但文件中的第一行是一个表示文件中有多少点的值,不应该包含在最终列表中Python 将文件写入元组列表,python,list,file,for-loop,tuples,Python,List,File,For Loop,Tuples,我试图读取一个文件并将其内容写入元组列表。每个元组的长度是2,列表的长度是可变的,这取决于我们从哪个文件读取。每个元组应表示x,y平面上的一个点,第一个值为x坐标,第二个值为y坐标。我遇到的问题是,我认为for循环是实现这一点的最佳方法,但文件中的第一行是一个表示文件中有多少点的值,不应该包含在最终列表中 def readDataPts(filename): """Reads data from an input file and returns a list of tuples
def readDataPts(filename):
"""Reads data from an input file and returns a list of tuples
[(x0,y0), (x1, y1), ...]
"""
file = open(filename, 'r')
lines = file.readlines()
listPts = []
for line in lines:
for ptx, pty in line:
x = (ptx, pty)
listPts.append(x)
return listPts
输入的一个例子是:
1096571
45734
174416
357259
88 97
188 495
348443
301 503
719177
182 237 输出应为:
[(96, 571), (45, 734), (174, 416), (357, 259), (88, 97).....]
有没有办法从第二行开始for循环?还是有更简单的方法来解决这个问题
谢谢您可以在file对象上调用next,跳过第一行,从第二行开始,然后拆分每行并调用tuple,或者让csv.reader解析每行并映射到tuple:
拆分:
with open("in.txt") as f:
next(f) # skip first line
arr = [tuple(line.split()) for line in f]
print(arr)
csv库:
import csv
with open("in.txt") as f:
next(f) # skip first line
arr = list(map(tuple, csv.reader(f,delimiter=" ")))
print(arr)
两者都将返回:
[('96', '571'), ('45', '734'), ('174', '416'), ('357', '259'), ('88', '97'), ('188', '495'), ('348', '443'), ('301', '503'), ('719', '177'), ('182', '237')]
如果您想要ints:
with open("in.txt") as f:
next(f) # skip first line
arr = [tuple(map(int, line.split())) for line in f]
print(arr)
和csv.reader:
import csv
with open("in.txt") as f:
next(f) # skip first line
arr = [tuple(map(int,row) for row in csv.reader(f,delimiter=" "))]
print(arr)
这将给你:
[(96, 571), (45, 734), (174, 416), (357, 259), (88, 97), (188, 495), (348, 443), (301, 503), (719, 177), (182, 237
您可以使用.split()
创建每行的元组并检查长度:
def readDataPts(filename):
listPts = []
with open(filename, 'r') as f:
for line in f:
numbers = line.split()
if len(numbers) == 2:
listPts.append(map(int, numbers))
return listPts
您可以使用告知循环仅迭代行[1:],这将跳过第一行并使用所有剩余的行
def readDataPts(filename):
"""Reads data from an input file and returns a list of tuples
[(x0,y0), (x1, y1), ...]
"""
file = open(filename, 'r')
lines = file.readlines()
listPts = []
for line in lines[1:]:
for ptx, pty in line:
x = (ptx, pty)
listPts.append(x)
return listPts
只是另一个想法
with open('in.txt') as f:
nums = map(int, f.read().split())
print zip(nums[1::2], nums[2::2])
谢谢你,太棒了。我甚至没有想到使用.split()啦啦队员来快速回复。我想我要实现顶部的.split()函数。不用担心,一个文件对象会返回它自己的迭代器,一旦你调用了next,你就可以转到第二行,这样就不需要做任何其他事情了,除了split和cast to tuple,如果你对列表没问题,只需split谢谢你的回复。我从来不知道你能给这样的for循环赋值。