Python-在CSV之间复制列,但组合字符串/整数值复制为空?
我有一个master.txt文件,我将其转换为master.csv,使用逗号作为分隔符。我正在尝试仅将我想要的列从master.csv复制到airpair.csv。我的第一列包含A1234和CB34555等值,这些值在aircraft.csv中显示为空白。列标题“N-NUMBER”会显示,其他列中的所有数据也会显示。如何解决此问题以获取完整数据Python-在CSV之间复制列,但组合字符串/整数值复制为空?,python,csv,arcpy,Python,Csv,Arcpy,我有一个master.txt文件,我将其转换为master.csv,使用逗号作为分隔符。我正在尝试仅将我想要的列从master.csv复制到airpair.csv。我的第一列包含A1234和CB34555等值,这些值在aircraft.csv中显示为空白。列标题“N-NUMBER”会显示,其他列中的所有数据也会显示。如何解决此问题以获取完整数据 import arcpy import csv import time time.sleep(7) arcpy.env.workspace = r"
import arcpy
import csv
import time
time.sleep(7)
arcpy.env.workspace = r"C:\GIS\final"
master = r"C:\GIS\final\MASTER.txt"
table = r"C:\GIS\final\MASTER.csv"
result = r"C:\GIS\final\aircraft.csv"
need = ["N-NUMBER", "NAME", "STREET", "STREET2", "CITY", "STATE", "ZIP CODE", "REGION", "TYPE AIRCRAFT"]
StartTime = time.clock()
in_txt = csv.reader(open(master, "rb"), delimiter = ',')
out_csv = csv.writer(open(table, 'wb'))
out_csv.writerows(in_txt)
del in_txt
del out_csv
EndTime = time.clock()
TotalTime = str(EndTime - StartTime)
print "Conversion Operation Complete in " + TotalTime + " seconds."
StartTime = time.clock()
with open(table) as infile, open(result, "wb") as outfile:
r = csv.DictReader(infile)
w = csv.DictWriter(outfile, need, extrasaction="ignore")
w.writeheader()
for row in r:
w.writerow(row)
EndTime = time.clock()
TotalTime2 = str(EndTime - StartTime)
print "Cleaning Operation Complete in " + TotalTime2 + " seconds."
我将提出一种我认为更简单的方法来解决这个问题,而不需要使用太多python模块: 编辑:我添加了一些代码,从第一行提取“需要”标签的索引,假设第一行是标题,然后将这些索引存储在“需要”中。
在这里,您只需打开文件,读取所有数据,然后在使用“想要”指定select索引后,将想要的数据写入一个新文件。这项工作不需要太多开销 我怀疑您的
master.txt
不是CSV文件。如果是这样的话-你不必要地转换了它。。。如果它有可以解析为dict的头和列,那么使用extracation='ignore'
的其余代码应该按计划工作。我同意Jon的观点。我在下面给出了一个答案,假设您已经创建了.csv,但您可以绕过该步骤,只在文件的默认分隔符上拆分内容。我在写入部分错误地使用了table[idx]
而不是row[idx]
,现在我已经修复了这个问题。我得到了基于“want=”的“ValueError:'N-NUMBER'不在列表中”线路。我将其更改为[need.index(x)for x in need],但尽管脚本运行,但这并没有重现确切的列表。显然,您建议的方式引用了列表“需要”,但在标题列表中找不到N号?我不明白为什么,因为N-NUMBER是.txt文件包含的第一个内容。@christopheddow您可以检查文件的第一行是否包含“需要”中的列标签吗?我假设文件的第一行包含一组以“,”分隔的标签,它们的格式与“需要”中的格式完全相同。第一行包含大约25个标题,以N号、序列号、MFR型号代码开始。。。。并包含“需要”列表中的所有需求。我只想保存“需要”列表中的那些列,而忽略其他列。N-NUMBER是整个.txt文件中的第一项,因此它肯定在那里。它的工作方式是,如果你有一个头=['a','b','c','d']
和need=['a','c']
那么想要=[header.index(x)for x in need]
将返回[0,2]
但这是假设您的格式与您描述的相同。
need = ["N-NUMBER", "NAME", "STREET", "STREET2", "CITY", "STATE", "ZIP CODE", "REGION", "TYPE AIRCRAFT"]
with open(infile, 'r') as f:
header = f.readline().split(',') # read and split the header
wanted = [header.index(x) for x in need] # get the indices you want out of the header
rows = f.readlines() # creates list of each row as a string
table = [r.split(',') for r in rows] # splits each row on the ','
with open(outfile, 'w') as o:
o.write(','.join(header) + '\n') # re-join the split header, write it
for row in table:
out_string = ','.join([row[idx] for idx in wanted]) + '\n'
o.write(out_string) # write a new csv with the columns specified in "wanted"