Python新手希望我能得到一些帮助。我有一堆列出GPS数据的.txt文件。我想创建一个python脚本,它将打开目录中的每个.txt文件并添加标题(在转换为.csv然后作为ESRI GIS要素类处理之前)。我有一些python代码将列出我的目标目录中的.txt文件,我也有一些python代码,将标题添加到单个指定的.txt文件,但我不知道如何将两位代码绑在一起所以整个脚本将处理所有.txt文件
Python代码列出.txt文件:
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文件列表。到目前为止一切都很好。
=====
Python将标头添加到指定的.txt文件
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:只能连接列表(不是" str")到列表
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"
如果有人能给我一些关于帮助我解决这个问题的正确方法的指示,那就太棒了。
答案 0 :(得分:0)
尝试使用listoffiles
生成glob.glob()
列表时出现错误。按照之前的连接创建目录字符串,我建议用以下内容替换该行:
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
转换回字符串(没有选项卡,BTW)之外没有做任何事情。观察:
>>> "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']
这是我怀疑你想要的。这是始终仔细检查变量和输出的另一个原因。