0

我正在尝试根据来自 csv 文件的输入将一行写入新文件,例如来自不同行和不同列的元素

测试.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 映射的参考中

4

3 回答 3

0

最容易适应您的需要是从您的文件中构建一个元组列表:

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

这里我用_表示我不关心四元组的前两个变量。因此,我什至没有命名它们。编写清晰的代码是一个很好的功能。

您也可以在一个循环中执行此操作:

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 ))
于 2013-06-01T15:05:36.337 回答
0

假设 python 2,您希望在文本文件中输出,并且您在代码的前面将命令和 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()
于 2013-06-01T15:13:37.877 回答
0

这是一个简单而通用的函数,它接受任何可迭代并生成所有顺序对(例如,1, 2, 3become (1, 2), (2, 3)):

def pairwise(iterable):
    it = iter(iterable)
    a = next(it)
    for b in it:
        yield a, b
        a = b

然后可以使用它来解决您的特定问题,如下所示:

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

这样做的一个优点是在开始输出之前您不会将整个输入读入内存,因此它适用于流式传输和任意大的文件。

于 2013-06-02T01:48:55.147 回答