0

我最初一直在尝试创建一个程序来遍历一个文件并选择某些列,然后将这些列移动到一个新的文本文件中。到目前为止我有

    import os, sys, csv
    os.chdir("C://Users//nelsonj//Desktop//Master_Project")
    with open('CHS_2009_test.txt', "rb") as sitefile:
    reader = csv.reader(sitefile, delimiter=',')
    pref_cols = [0,1,2,4,6,8,10,12,14,18,20,22,24,26,30,34,36,40]

    for row in reader:
        new_cols = list(row[i] for i in pref_cols)
        print new_cols

我一直在尝试使用 csv 函数来编写新文件,但我不断收到错误。我最终需要在一个文件文件夹上执行此操作,但我想在解决这个问题之前我会尝试在一个文件夹上执行此操作。

我试图用来将此数据写入新文件的代码

    for row in reader:
        with open("CHS_2009_edit.txt", 'w') as file:
            new_cols = list(row[i] for i in pref_cols)
            newfile = csv.writer(file)
            newfile.writerows(new_cols)

这种工作方式是我得到一个新文件,但只打印来自我的 csv 的第二行值,即不打印标题值,并在每个单独的字符之间放置逗号,而不仅仅是复制原始列.

我正在使用 PythonWin 和 Python 2.6(来自 ArcGIS)

谢谢您的帮助!

新更新的代码

   import os, sys, csv

   path = ('C://Users//nelsonj//Desktop//Master_Project')

   for filename in os.listdir(path):

       pref_cols = [0,1,2,4,6,8,10,12,14,18,20,22,24,26,30,34,36,40]
       with open(filename, "rb") as sitefile:
           with open(filename.rsplit('.',1)[0] + "_Master.txt", 'w') as output_file:
               reader = csv.reader(sitefile, delimiter=',')
               writer = csv.writer(output_file)
               for row in reader:
                   new_row = list(row[i] for i in pref_cols)
                   writer.writerow(new_row)
                   print new_row

使 new_row 的列表索引超出范围,但它似乎仍在处理该文件。我现在唯一不能做的就是遍历我目录中的所有文件。这是 数据文本文件截图的超链接

4

2 回答 2

1

尝试这个:

 new_header = list(row[i] for i in pref_cols if i in row)

那应该避免错误,但可能无法避免潜在的问题。您能否将您的 CSV 文件粘贴到我可以访问的地方,我会为您解决这个问题?

于 2013-11-11T17:42:43.370 回答
0

为了您的过滤目的,您不必将标头与其余数据区别对待。您可以继续删除以下块:

    headers = reader.next()
    for row in headers:
        new_header = list(row[i] for i in pref_cols)
        print new_header  

您的代码不起作用,因为您将标题视为行列表,但标题只是一行。

更新

此更新处理将 CSV 数据写入新文件。您应该将open语句移到for row...

with open("CHS_2009_edit.txt", 'w') as output_file:
    writer = csv.writer(output_file)
    for row in reader:
        new_cols = list(row[i] for i in pref_cols)
        writer.writerows(new_cols)

更新 2

此更新处理标题输出问题。如果你听从了我的建议,你应该不会有这个问题。我不知道您当前的代码是什么样的,但看起来您提供了一个字符串,代码需要一个列表。这是我在系统上尝试的代码(使用我的虚构数据),它似乎有效:

pref_cols = [...] # <<=== Should be set before entering the loop
with open('CHS_2009_test.txt', "rb") as sitefile:
    with open('CHS_2009_edit.txt', 'w') as output_file:
        reader = csv.reader(sitefile, delimiter=',')
        writer = csv.writer(output_file)
        for row in reader:
            new_row = list(row[i] for i in pref_cols)
            writer.writerow(new_row)

需要注意的一件事:我writerow()习惯在你使用的地方写一行writerows()- 这会有所不同。

于 2013-11-11T17:54:41.063 回答