【问题标题】:Creating a list from a CSV file using Python使用 Python 从 CSV 文件创建列表
【发布时间】:2011-05-06 19:12:45
【问题描述】:

到目前为止,我有一个 Python 脚本可以完成我的工作...打开用户定义的 CSV,将文件拆分为不同的预定义“池”,然后将它们重新制作成自己的文件,并带有适当的标题。我唯一的问题是我想将池列表从静态更改为变量;并有一些问题。

池列表位于其自身的 CSV 中,在第 2 列中。并且可以复制。现在,通过此设置,系统可以创建除标题之外没有数据的“死”文件。

一些注意事项:是的,我知道拼写并不完美,是的,我知道我的一些 cmets 有点偏离

import csv
#used to read ane make CSV's
import time
#used to timestamp files
import tkFileDialog
#used to allow user input
filename = tkFileDialog.askopenfilename(defaultextension = ".csv")
#Only user imput to locate the file it self
csvfile = [] 
#Declairs csvfile as a empty list
pools = ["1","2","4","6","9","A","B","D","E","F","I","K","L","M","N","O","P","W","Y"]
#declairs hte pools list for known pools
for i in pools:
    #uses the Pools List and makes a large number of variables
    exec("pool"+i+"=[]")
reader = csv.reader(open(filename, "rb"), delimiter = ',')
 #Opens the CSV for the reader to use
for row in reader: 
    csvfile.append(row) 
    #dumps the CSV into a varilable
    headers=[]
    #declairs headers as empty list
    headers.append(csvfile[0])
    #appends the first row to the header variable
for row in csvfile: 
    pool = str(row[1]).capitalize()
    #Checks to make sure all pools in the main data are capitalized
    if pool in pools:
        exec("pool"+pool+".append(row)")
        #finds the pool list and appends the new item into the variable list
    else: 
        pass
for i in pools:
    exec("wp=csv.writer(open('pool "+i+" "+time.strftime("%Y%m%d")+".csv','wb'),)")
    wp.writerows(headers)
    #Adds the header row
    exec("wp.writerows(pool"+i+")")
    #Created the CSV with a timestamp useing the pool list
    #-----Needs Headers writen in on each file -----

编辑: 由于有一些问题

代码的原因:我正在生成每日报告,其中需要手动处理的部分报告将这些报告拆分为不同的池报告。我正在创建这个脚本,以便我可以快速选择它自己的文件并将它们快速拆分成自己的文件。

主 CSV 的长度可以从 50 到 100 个项目,它共有 25 列,并且池总是会列在第二列。并非所有池都会一直列出,并且池会出现不止一次。

到目前为止,我已经尝试了几种不同的循环;一个如下

池 = [] 对于文件中的行(打开(文件名,'rb')): line = line.split() x = 线[1] pools.append(x)

但是我得到了一个列表错误。

CSV 示例:

Ticket Pool Date Column 4 Column 5

1   A   11/8/2010   etc etc

2   A   11/8/2010   etc etc

3   1   11/8/2010   etc etc

4   6   11/8/2010   etc etc

5   B   11/8/2010   etc etc

6   A   11/8/2010   etc etc

7   1   11/8/2010   etc etc

8   2   11/8/2010   etc etc

9   2   11/8/2010   etc etc

10  1   11/8/2010   etc etc

【问题讨论】:

  • 我建议您发布您的意图。看起来很复杂,可能您的意图可以通过简单的方式实现。我同意 SilentGhost 的观点。
  • dStulle 能够向我展示我需要做什么。谢谢!

标签: python csv


【解决方案1】:

如果我正确理解您想要在这里实现的目标,这可能是解决方案:

import csv
import time
import tkFileDialog

filename = tkFileDialog.askopenfilename(defaultextension = ".csv")

reader = csv.reader(open(filename, "rb"), delimiter = ',')

headders = reader.next()

pool_dict = {}

for row in reader:
    if not pool_dict.has_key(row[1]):
        pool_dict[row[1]] = []
    pool_dict[row[1]].append(row)
       
for key, val in pool_dict.items():
    wp = csv.writer(open('pool ' +key+ ' '+time.strftime("%Y%m%d")+'.csv','wb'),)
    wp.writerow(headders)
    wp.writerows(val)

编辑:首先误解了标头和池的事情并试图纠正问题。

编辑 2:更正了从文件中找到的值动态创建的池。

如果不是,请提供您的问题的更多详细信息……

【讨论】:

  • 这比我做的干净多了。我遇到的唯一问题是它正在拉 25 个标头而不是池列表,它为每个标头创建 25 个文件...
  • 那么你想从哪里得到你的台球线呢?还是应该在代码中?
  • 你的想法是对的;但是我在这样的列表中列出池的问题是,如果该池没有值,它仍然会创建只有标题的文件;没有数据。
  • 好的,我想我明白了,再试一次……
【解决方案2】:

您能稍微描述一下您的 CSV 文件吗?

一个建议是改变

for i in pools:
#uses the Pools List and makes a large number of variables
    exec("pool"+i+"=[]")

到更 Pythonic 的形式:

pool_dict = {}
for i in pools:
    pool_dict[i] = []

一般来说,使用 eval/exec 是不好的,而且更容易说遍历字典。例如,通过 pool_dict['A']、pool_dict['1'] 访问变量或像循环一样遍历所有变量

for key,val in pool_dict.items():
   val.append(...)

编辑:现在看到 CSV 数据,尝试如下操作:

for row in reader:
    if row[0] == 'Ticket':
        header = row
    else:
        cur_pool = row[1].capitalize()
        if not pool_dict.has_key(cur_pool):
            pool_dict[cur_pool] = [row,]
        else:
            pool_dict[cur_pool].append(row)

for p, pool_vals in pool_dict.items:
    with open('pool'+p+'_'+time.strftime("%Y%m%d")+'.csv','wb'),) as fp:
        wp = csv.writer(fp)
        wp.writerow(header)
        wp.writerows(pool_vals)

【讨论】:

  • 如果由于某种原因池的值是“池”,这些行将被忽略,最后一行成为输出文件的新标题。我承认,这不太可能……
  • Ok 更改为检查 row[0] 是否为“票”,因为可能不是有效票#。不要认为假设标题始终是第零行并且不会作为文件中的另一行重复是不安全的。但又一次;这最终取决于数据;并且相当小。 (但确实注意到我的代码中至少有 3 个错误——草率(在比较中没有 ==,使标题只是 row[1] 并试图附加到 dict 而不是 pool_dict[cur_pool])。)这也是一个很好的做法使用 with open( ) 作为 fp 习惯用法,因为它确保文件即使在异常情况下也能正确关闭。
【解决方案3】:

如果没有这些高管,您的代码会更容易阅读。似乎您使用它们来声明所有变量,而实际上您可以像这样声明池列表:

pool_lists = [[] for p in pools]

这是我对“我想将池列表从静态更改为变量”的意思的最佳猜测。执行此操作时,您将获得与池长度相同的列表列表。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-18
    • 1970-01-01
    • 1970-01-01
    • 2013-08-15
    • 1970-01-01
    • 2018-09-02
    • 2018-07-16
    • 1970-01-01
    相关资源
    最近更新 更多