使用添加多个.txt文件的标题行
我是一名Python新手,希望能得到一些帮助。我有一堆.txt文件,里面记录了GPS数据。我想写一个Python脚本,打开目录中的每个.txt文件,并在它们前面添加一些标题(之后再转换成.csv格式,然后处理成ESRI GIS特征类)。我已经有一些Python代码可以列出目标目录中的.txt文件,还有一些代码可以给指定的.txt文件添加标题,但我不太确定怎么把这两部分代码结合起来,让整个脚本处理所有的.txt文件。
列出.txt文件的Python代码:
import glob
Workspace = "C:\\Pathway\\ToTarget"
date = time.strftime('%y_%m_%d')
Directory = Workspace + "\\" + date
glob.glob(Directory + "./*.txt")
所以,如果我执行
import glob
Workspace = "C:\\Pathway\\ToTarget"
date = time.strftime('%y_%m_%d')
Directory = Workspace + "\\" + date
listoffiles = glob.glob(Directory + "./*.txt")
print listoffiles
我就能得到目标目录中所有.txt文件的列表。目前为止一切正常。
================
给指定.txt文件添加标题的Python代码
listoffiles = "C:\\Pathway\\to\\Target_Dir\\Log - Copy (2).txt"
headers = "SENT_ID,TIME_UTC,NAV_WARN,LAT,N_S,LONG,E_W,SPEED,COURSE,DATE,MAG_VAR,,CHECK".split()
for line in fileinput.input([listoffiles], inplace=True):
if fileinput.isfirstline():
print '\t'.join(headers)
print line,
这段代码会改变指定.txt文件的第一行。很好。
================
合并代码
但是如果我这样做:
import glob
import fileinput
import os
import time
Workspace = "C:\\Pathway\\ToTarget"
date = time.strftime('%y_%m_%d')
Directory = Workspace + "\\" + date
listoffiles = glob.glob(Directory + "./*.txt")
headers = "SENT_ID,TIME_UTC,NAV_WARN,LAT,N_S,LONG,E_W,SPEED,COURSE,DATE,MAG_VAR,,CHECK".split()
for line in fileinput.input([listoffiles], inplace=True):
if fileinput.isfirstline():
print '\t'.join(headers)
print line,
我得到的错误是:TypeError: 只能将列表(而不是“字符串”)连接到列表。
Message File Name Line Position
Traceback
<module> C:\Users\pennychr\Desktop\GPS_2.py 58
next C:\Python27\ArcGIS10.2\lib\fileinput.py 253
readline C:\Python27\ArcGIS10.2\lib\fileinput.py 318
"TypeError: can only concatenate list (not ""str"") to list"
如果有人能给我一些建议,告诉我正确的方法来解决这个问题,那就太好了。
1 个回答
看起来在用 glob.glob()
生成 listoffiles
列表时出现了错误。结合你之前拼接的目录字符串,我建议把那一行替换成下面的内容:
listoffiles = glob.glob(Directory + "\\*.txt")
然后看看这样是否有效。你一直在使用 Windows 的文件路径,但 './*.txt'
是 UNIX 风格的写法,意思是“当前目录下所有以 .txt
结尾的文件”。在你的情况下,这样写不太合适,因为它在 Directory
的末尾加了一个 .
,然后才是 \\*.txt
。
在调试时,逐行运行你的代码是非常有帮助的,可以在 IDLE、IPython 或其他工具中检查每一步变量的值。或者,在每次给变量赋值后加一个 print
语句,这样可以查看当前的值,确保它符合你的预期。
除了上面的错误,还有其他问题引起了我的注意:
headers = "SENT_ID,TIME_UTC,NAV_WARN,LAT,N_S,LONG,E_W,SPEED,COURSE,DATE,MAG_VAR,,CHECK".split()
这段代码并没有按你想的那样工作。string.split()
函数如果不传任何参数,会根据空白字符进行分割,而你的输入中没有空白字符。因此,后面的 print '\t'.join(headers)
语句其实没有做什么,只是把单个元素的列表 headers
转换回了字符串(顺便说一下,没有制表符)。看看这个:
>>> "SENT_ID,TIME_UTC,NAV_WARN,LAT,N_S,LONG,E_W,SPEED,COURSE,DATE,MAG_VAR,,CHECK".split()
['SENT_ID,TIME_UTC,NAV_WARN,LAT,N_S,LONG,E_W,SPEED,COURSE,DATE,MAG_VAR,,CHECK']
它只返回一个包含完整字符串的单元素列表。不过,如果按逗号 ,
来分割,就会得到:
>>> "SENT_ID,TIME_UTC,NAV_WARN,LAT,N_S,LONG,E_W,SPEED,COURSE,DATE,MAG_VAR,,CHECK".split(',')
['SENT_ID', 'TIME_UTC', 'NAV_WARN', 'LAT', 'N_S', 'LONG', 'E_W', 'SPEED', 'COURSE', 'DATE', 'MAG_VAR', '', 'CHECK']
这正是我猜测你想要的结果。这也是为什么我们总是要仔细检查变量和输出的原因。