用python中不同行的输入编写一行

2024-09-25 06:23:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图根据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映射的引用中迷失了方向


Tags: 文件csv元素内容地址commandvalue1name1
3条回答

下面是一个简单而通用的函数,它接受任何iterable并生成所有序列对(例如,1, 2, 3变成(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))

这样做的一个优点是,在开始输出之前,您不会将整个输入读取到内存中,因此对于流式处理和任意大的文件来说,它会很好地工作。你知道吗

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

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

假设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()

相关问题 更多 >