如何在Python中合并来自不同txt文件的一些列数据?

时间:2015-05-06 16:04:57

标签: python merge

我有一些txt文件,需要提取某些列并存储在一个txt文件中。

a1.txt:

  

53,52,54,38
,37,37,58,48   

b1.txt:

  

45,15,30,2 <16,59,31,4,41,09,32,5   58,16,33,3

我需要的是什么 c.txt(将b1.txt的最后一列添加到a1.txt):

  

53,52,2,51,38,4 4,57,37,5,57,48,3

b.txt的第4列应添加到a.txt的第5列。然后创建一个新文件c.txt。 我尝试了一些代码,但它没有用。 cmd说"TypeError: list indice must be integers, not srt"。 我不知道如何将不同文件中的列合并在一起。希望有人可以帮我修改代码。非常感谢你!

def readf(filename):
    lines=file(filename).readlines()
    for i in lines:
        data=i.split()
    return data

fa=readf('a1.txt')
fb=readf('b1.txt')

lines=[]
for i in fa:
    s=fa[i]+fb[3]
    s+='\n'
    lines.append(s)

with open ('c.txt','w') as f:
    f.writelines(lines)
    f.close>

4 个答案:

答案 0 :(得分:3)

在以下命令中,您已将字符串作为索引传递给列表:

for i in fa:
    s=fa[i]+fb[3]

注意您正在迭代文件对象!

但作为解决此类问题的更好方法,我建议使用csv模块。

from itertools import izip_longest
import csv
with open('a1.txt', 'rb') as csv1,open('b1.txt', 'rb') as csv2,open('c.txt', 'w') as out:
     spam1 = csv.reader(csv1, delimiter=',')
     spam2 = csv.reader(csv2, delimiter=',')
     last_column=list(izip_longest(*spam2))[-1]
     for i,j in  izip_longest(spam1,last_column):
        out.write(','.join([t.strip(';') for t in i])+','+j+'\n')

此处last_column=list(izip_longest(*spam2))[-1]将为您提供b1.txt的最后一栏,izip_longest(spam1,last_column)将为您提供以下列表:

[(['53', ' 42;'], ' 2;'), (['54', ' 38;'], ' 4;'), (['55', ' 37;'], ' 5;'), (['57', ' 48; '], ' 3;')]

因此,您可以使用;删除元素并写入文件。

如果可以忽略;,您可以将最后一行更改为:

out.write(','.join(i)+','+j+'\n')

答案 1 :(得分:2)

由于您需要使用,;作为参数来拆分文本,因此您可以使用re来完成作业。然后只是第一个文件的所有属性或第二个文件的最后一个属性。

import re
with open("a.txt", 'r') as f:
    a1 = [re.findall(r"[\w']+", line) for line in f]
with open("b.txt", 'r') as b:
    b1 = [re.findall(r"[\w']+", line) for line in b]
with open("c.txt", 'w') as c:
    for x,y in zip(a1,b1):
        c.write("{},{}\n".format(",".join(x),y[-1]))  

这会创建文件c,看起来像

53,42,2 
54,38,4 
55,37,5 
57,48,3

答案 2 :(得分:2)

你如何使用熊猫:

53, 42, 2;
54, 38, 4;
55, 37, 5;
57, 48, 3;

c.txt:

Date<-format(seq(as.POSIXct("2014-01-01 01:00"), as.POSIXct("2015-01-01 00:00"),     by="hour"), "%Y-%m-%d %H:%M", usetz = FALSE)
Flow<-runif(8760, 0, 2300)

IsHigh<- function(x ){
    if (x < 1600) return(0) 
    if (1600 <= x) return(1) 
}

isHighFlow = unlist(lapply(Flow, IsHigh))

df = data.frame(Date, Flow, isHighFlow )

答案 3 :(得分:1)

def read_file(file_name):
    col_data = []
    with open(file_name) as data_file:
        for data in data_file.readlines():
            col1, col2, col3, col4 = data.split(",")
            col_data.append(col4[:-1])
    return col_data

numbers = read_file("b1.txt")

with open("a1.txt") as a_file:
    with open("new_file.txt", "w") as new_file:
        lines = a_file.readlines()
        for line in xrange(len(lines)):
            new_file.write(lines[line][:-1] + " ,"+numbers[line]+"\n")