Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中使用来自不同行的输入编写一行_Python_Loops_Csv_Row - Fatal编程技术网

在python中使用来自不同行的输入编写一行

在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

我正试图根据csv文件的输入向新文件写入一行,例如,使用来自不同行和不同列的元素

test.csv:

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))