我有一些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>
答案 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")