使用将标题行添加到多个.text文件

时间:2014-06-27 04:04:24

标签: python

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"

如果有人能给我一些关于帮助我解决这个问题的正确方法的指示,那就太棒了。

1 个答案:

答案 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']

这是我怀疑你想要的。这是始终仔细检查变量和输出的另一个原因。