我有许多大的以制表符分隔的文件保存为.txt
,每个文件都有七列,其中包含以下标题:
#column_titles = ["col1", "col2", "col3", "col4", "col5", "col6", "text"]
我想简单地提取名为text
的最后一列,并将其保存到一个新文件中,每行都是原始文件的一行,而且都是字符串。
编辑:这不是a similar problem的重复,因为在我的情况下splitlines()
不是必需的。只有事情的顺序需要改进
基于 - several - other - posts,这是我目前的尝试:
import csv
# File names: to read in from and read out to
input_file = "tester_2014-10-30_til_2014-08-01.txt"
output_file = input_file + "-SA_input.txt"
## ==================== ##
## Using module 'csv' ##
## ==================== ##
with open(input_file) as to_read:
reader = csv.reader(to_read, delimiter = "\t")
desired_column = [6] # text column
for row in reader:
myColumn = list(row[i] for i in desired_column)
with open(output_file, "wb") as tmp_file:
writer = csv.writer(tmp_file)
for row in myColumn:
writer.writerow(row)
我得到的只是来自第2624行的文本字段构成我的输入文件,该字符串中的每个字母都被分开:
H,o,w, ,t,h,e, ,t.e.a.m, ,d,i,d, ,T,h,u,r,s,d,a,y, ,-, ,s,e,e , ,h,e,r,e
我对编程世界知之甚少是随机的,但这绝对是奇怪的!
This post非常类似于我的需求,但是错过了写作和保存部分,我也不确定。
我已经研究过使用pandas
工具箱(根据上面的链接之一),但我无法安装我的Python,所以请仅使用csv
或其他内置模块的解决方案!
答案 0 :(得分:1)
我会选择这个简单的解决方案:
text_strings = [] # empty array to store the last column text
with open('my_file') as ff:
ss = ff.readlines() # read all strings in a string array
for s in ss:
text_strings.append(s.split('\t')[-1]) # last column to the text array
with open('out_file') as outf:
outf.write('\n'.join(text_strings)) # write everything to output file
使用列表推导,您可以更快地将ss
个字符串的最后一列转换为text_strings
:
text_strings = [k.split("\t")[-1] for k in ss]
还有其他简化方法,你明白了)
代码中的问题出现在以下两行:
for row in reader:
myColumn = list(row[i] for i in desired_column)
首先,没有缩进,所以没有任何事情发生。实际上,在我的计算机上,它会抛出一个错误,所以有可能是一个错字。但是在这种情况下,在for循环的每一步,你都会用来自新行的那个值覆盖myColumn
值,因此最后你有一个来自文件最后一行的字符串。
其次,list
应用于字符串(如在代码中),将字符串转换为字符列表:
In [5]: s = 'AAAA'
In [6]: list(s)
Out[6]: ['A', 'A', 'A', 'A']
这正是您在输出中看到的内容。
答案 1 :(得分:1)
您必须一次处理一行文件:读取,解析和写入。
import csv
# File names: to read in from and read out to
input_file = "tester_2014-10-30_til_2014-08-01.txt"
output_file = input_file + "-SA_input.txt"
## ==================== ##
## Using module 'csv' ##
## ==================== ##
with open(input_file) as to_read:
with open(output_file, "wb") as tmp_file:
reader = csv.reader(to_read, delimiter = "\t")
writer = csv.writer(tmp_file)
desired_column = [6] # text column
for row in reader: # read one row at a time
myColumn = list(row[i] for i in desired_column) # build the output row (process)
writer.writerow(myColumn) # write it