ekl*_*e 1 8 python csv dictionary
我正在编写一些代码,以从输入 .txt 文件生成两个新的 CSV 文件。.txt 文件有 40 列数据,我正在编写两个新的 csv 文件,每个文件仅从 .txt 文件中获取 2 列。
我的代码运行良好,几乎完全符合我的需要。最后一步是重命名两个新 csv 输出中的原始标头。
这是我的代码:
import csv
QATargetHeaders = ['FNAME','LNAME']
FinalTargetHeaders = ['PROJECT_CODE','PHONE_NUMBER']
with open('TEST.txt','r') as csv_input, open('Test_QA2.csv','w') as csv_output:
reader = csv.DictReader(csv_input, delimiter='^')
writer = csv.DictWriter(csv_output, fieldnames=QATargetHeaders, extrasaction='ignore')
writer.writeheader()
for line in reader:
writer.writerow(line)
with open('TEST.txt','r') as csv_input, open('Test_FINAL.csv','w') as csv_output:
reader = csv.DictReader(csv_input, delimiter='^')
writer = csv.DictWriter(csv_output, fieldnames=FinalTargetHeaders, extrasaction='ignore')
writer.writeheader()
for line in reader:
writer.writerow(line)
Run Code Online (Sandbox Code Playgroud)
对于 TEST_QA2.csv,我需要更改标题:
FNAME = First Name
LNAME = Last Name
Run Code Online (Sandbox Code Playgroud)
对于 TEST_FINAL.csv,我需要更改标题:
PROJECT_CODE = PROJECT ID
PHONE_NUMBER = DEVICE1
Run Code Online (Sandbox Code Playgroud)
有人可以帮我弄清楚如何在这里重写标题吗?TargetHeaders 必须定义为 .txt 文件中的确切列名,以便我的作者知道要复制哪些内容。提前感谢您
而不是writeheader使用writerow将旧标头映射到新标头的字典。然后您可以像以前一样编写其他行。
QATargetHeaders = {'FNAME': 'First Name','LNAME': 'Last Name'}
FinalTargetHeaders = {'PROJECT_CODE': 'PROJECT ID','PHONE_NUMBER': 'DEVICE1'}
...
writer = csv.DictWriter(csv_output, fieldnames=QATargetHeaders, extrasaction='ignore')
writer.writerow(QATargetHeaders) # instead of writeheader
for line in reader:
writer.writerow(line)
...
Run Code Online (Sandbox Code Playgroud)
(从 Python 3.7 开始,字典保留顺序,因此列将以正确的顺序显示。如果使用早期版本的 Python,您需要创建单独的字段名称列表,或使用OrderedDict, 以确保列出现在按正确顺序排列的 CSV 文件。)
line是一个dict. 字典键用作标头。因此,您必须在写入新 csv 之前重命名键。您可以通过字典理解来做到这一点。
import csv
QATargetHeaders = ['First Name','Last Name']
FinalTargetHeaders = ['PROJECT ID','DEVICE1']
map_QATargetHeaders = (('FNAME', 'First Name'), ('LNAME', 'Last Name'))
map_FinalTargetHeaders = (('PROJECT_CODE', 'PROJECT ID'), ('PHONE_NUMBER', 'DEVICE1LNAME'))
with open('TEST.txt','r') as csv_input, open('Test_QA2.csv','w') as csv_output:
reader = csv.DictReader(csv_input, delimiter='^')
writer = csv.DictWriter(csv_output, fieldnames=QATargetHeaders, extrasaction='ignore')
writer.writeheader()
for line in reader:
line = {map[1]:line[map[0]] for map in map_QATargetHeaders}
writer.writerow(line)
with open('TEST.txt','r') as csv_input, open('Test_FINAL.csv','w') as csv_output:
reader = csv.DictReader(csv_input, delimiter='^')
writer = csv.DictWriter(csv_output, fieldnames=FinalTargetHeaders, extrasaction='ignore')
writer.writeheader()
for line in reader:
line = {map[1]:line[map[0]] for map in map_FinalTargetHeaders}
writer.writerow(line)
Run Code Online (Sandbox Code Playgroud)