我有一个包含“5个值”的文本文件。我有以下信息
[LENGTH, START INDEX(1 instead of 0), TYPE]
[4, 1, "TypeA"]
[11, 5, "TypeB"]
[5, 16, "Charles"]
假设必须为每行文本处理这些指令,那么在python中逐行执行此操作的最有效方法是从输入文件生成CSV(请注意,空格和字符无关紧要对于线的任何变化。相同的说明适用)?
即。如果这是文件中的一行:
ABCD EFGHIJK LMNOP QR
基于上述说明的处理行的“csv版本”结果将是:
"ABCD ", "EFGHIJK LMN", "OP QR"
没有尾随空格将是:
“ABCD”,“EFGHIJK LMN”,“OP QR”
答案 0 :(得分:1)
获得列表后,只需在其所有元素上使用strip
:
data = [s.strip() for s in line]
演示:
>>> line = ["ABCD ", "EFGHIJK LMN", "OP QR"]
>>> data = [s.strip() for s in line]
>>> data
['ABCD', 'EFGHIJK LMN', 'OP QR']
答案 1 :(得分:1)
正如我在评论中提到的,我没有看到你的规格如何与你想要的输出相匹配 - 它们似乎并不一致。因此,就本答案而言,我将更改您的TypeA
“指令”,以使其与其他指令保持一致。
但是,您可以使用字符串切片和csv
模块将固定宽度格式文件转换为csv
。例如,像
import csv
specs = [[5, 0, "TypeA"],
[11, 5, "TypeB"],
[5, 16, "Charles"]]
with open("filename.txt") as infile, open("out.csv", "wb") as outfile:
writer = csv.writer(outfile, quoting=csv.QUOTE_ALL)
names = [s[-1] for s in specs]
writer.writerow(names)
for line in infile:
row = [line[start:start+length] for length, start, name in specs]
writer.writerow(row)
会产生
dsm@notebook:~/coding$ cat out.csv
"TypeA","TypeB","Charles"
"ABCD ","EFGHIJK LMN","OP QR"
如果您要对表格数据进行大量处理,那么我建议您查看pandas
库,这样可以更加简单:
import pandas as pd, csv
df = pd.read_fwf("filename.txt", widths=(5,11,5), names=["TypeA", "TypeB", "Charles"])
df.to_csv("out.csv", index=False, quoting=csv.QUOTE_ALL)