使用添加多个.txt文件的标题行

0 投票
1 回答
1619 浏览
提问于 2025-04-18 11:17

我是一名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 个回答

0

看起来在用 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']

这正是我猜测你想要的结果。这也是为什么我们总是要仔细检查变量和输出的原因。

撰写回答