在python中使用来自不同行的输入编写一行
我正试图根据csv文件的输入向新文件写入一行,例如,使用来自不同行和不同列的元素 test.csv:在python中使用来自不同行的输入编写一行,python,loops,csv,row,Python,Loops,Csv,Row,我正试图根据csv文件的输入向新文件写入一行,例如,使用来自不同行和不同列的元素 test.csv: name1, value1, integer1, integer1a name2, value2, integer2, integer2a name3, value3, integer3, integer3a 期望输出: command integer1:integer1a moretext integer2:integer2a command integer2:integer2a moret
name1, value1, integer1, integer1a
name2, value2, integer2, integer2a
name3, value3, integer3, integer3a
期望输出:
command integer1:integer1a moretext integer2:integer2a
command integer2:integer2a moretext integer3:integer3a
我意识到这可能是某种类型的循环,我只是在循环交互和python映射的引用中迷失了方向最容易适应您的需要的是从您的文件中构建元组列表:
data = []
for l in open('file.csv'):
data.append( l.strip().split() )
在这一点上,数据是一个四倍的列表。所以你可以这样做你的例子:
for i in range(len(data)/2):
_,_,i1,i2 = data[2*i]
_,_,j1,j2 = data[2*i+1]
print('command {}:{} moretext {}:{}'.format( i1,i2,j1,j2 ))
这里我用u来表示,我不关心四倍体的前两个变量。因此,我甚至没有给他们命名。编写清晰的代码是一个很好的特性
也可以在单个循环中执行此操作:
f = open('file.csv')
while True:
l1 = f.readline()
l2 = f.readline()
if not l1 or not l2: break # file ended
_,_,i1,i2 = l1.strip().split()
_,_,j1,j2 = l2.strip().split()
print('command {}:{} moretext {}:{}'.format( i1,i2,j1,j2 ))
假设Python2,您希望将输出保存在文本文件中,并将命令和moretext保存为代码前面的变量
from csv import reader
f = reader(open('test.csv'))
data = [str(r[2]) +':' + str(r[3]) for r in f]
out = open('out.txt', 'w')
for i in range(len(data)-1):
print >> out, command + data[i] + moretext + data[i+1]
out.close()
这里有一个简单而通用的函数,它接受任何iterable并生成所有序列对(例如,
1,2,3
变成(1,2)、(2,3)
):
然后,可以使用此方法解决您的特定问题,如下所示:
with open('outputfile', 'w') as out:
for (_, _, a1, a2), (_, _, b1, b2) in pairwise(
[w.strip() for w in l.split(',')] for l in open('test.csv')):
out.write('command %s:%s moretext %s:%s\n' % (a1, a2, b1, b2))
这样做的一个优点是,在开始输出之前,您不会将整个输入读取到内存中,因此它对于流式处理和任意大的文件都很有效。欢迎使用堆栈溢出!对不起,我发现很难弄明白你在问什么。如果您包含一些代码来显示您所做的尝试,这将有所帮助,这将使我们更容易帮助您。也许你也可以看看一篇关于如何提出好问题的好文章?为什么不把它合并成一个循环呢?如果输入文件包含数十亿行怎么办?:)因为我不知道他到底想要什么。这种方法在你开始时更容易理解。我是python新手,你指的是什么?“,”很抱歉没有澄清,csv文件将有2到100行。在这里,但我想说的是,我同意你关于按值调用与调用规程的任何其他名称的说法。当我使用open到达该行时,会出现一个错误。我正在MacOSI上使用Python2.7.1,刚刚做了一些编辑,你能再试一次吗?您是否在当前工作目录中保存了test.csv?另外,请确保在command和moretext下保存了一些测试。这给了我一个错误,显然是out。close()需要在非缩进行上?这很有效,非常感谢!out.close()的问题就在我这方面,您的工作方式是这样的,再次感谢。是的,您只想在完全完成文件后关闭它。如果它在循环中,它将提前关闭,并且您将在下一次迭代中得到一个错误。
with open('outputfile', 'w') as out:
for (_, _, a1, a2), (_, _, b1, b2) in pairwise(
[w.strip() for w in l.split(',')] for l in open('test.csv')):
out.write('command %s:%s moretext %s:%s\n' % (a1, a2, b1, b2))