从CSV中读取两列变量,一次对它们执行某些操作?

时间:2017-12-23 21:07:12

标签: python python-3.x loops csv multiple-columns

我有以下CSV:

AD_NAME,PTL_NAME
AdminsG,TEST_1
SVC ACCTSG,TEST_2
SQL AdminsG,TEST_3

为简单起见?为了说明,我试图为第0列中的每一行创建一个新文件夹,并在每个文件夹中创建一个基于同一行中第1列的文本文件:

AdminsG
        ->TEST_1.txt
SVC ACCTSG
        ->TEST_2.txt
SQL AdminsG
        ->TEST_3.txt

然而

f = csv.reader(open('GROUP_NAMES.csv', 'r'), delimiter=',')
next(f)
col = list(zip(*f))[0]
for row in col:  
    os.makedirs(row)
    col2 = list(zip(*f))[1]
    for row in col2:
        #...code to write txt files...

返回
IndexError: list index out of range


f = csv.reader(open('GROUP_NAMES.csv', 'r'), delimiter=',')
next(f)
col = list(zip(*f))[0]
for row in col:  
    os.makedirs(row)

创建3个根文件夹就好了,所以我想我错过了在循环的同一次迭代中插入第二列变量的位置。

3 个答案:

答案 0 :(得分:2)

看起来问题是该列表只有一个索引,其中包含一组设置值:

[('AdminsG', 'SVC ACCTSG', 'SQL AdminsG'), ('TEST_1', 'TEST_2', 'TEST_3')]

因此,当您尝试执行此行时,它会尝试查找不存在的索引1。

col2 = list(zip(*f))[1]

您可能希望将其更改为:

f = csv.reader(open('temp.csv', 'r'), delimiter=',')
next(f)
data = list(zip(*f))
row, col = data[0], data[1]
data = (zip(row, col))
for col1, col2 in data:
     os.mkdirs(os.path.join(col1, col2))

还有一种方法可以编写相同的代码:

import os
import csv

with open('GROUP_NAMES.csv', 'r') as csvReader:
    csv_obj = csv.reader(csvReader)
    for col1, col2 in csv_obj:
       if col1 == 'AD_NAME' and col2 == 'PTL_NAME':
           continue
       os.mkdirs(os.path.join(col1, col2))

答案 1 :(得分:1)

我认为你在这里解决了这个问题。

这是我写的快速解决方案:

f = csv.reader(open('GROUP_NAMES.csv', 'r'), delimiter=',')
headers = []
for row in f:
   if not headers:
        headers = row
       continue
    path = os.sep.join(row)
    os.makedirs(path)

此解决方案遍历所有行(跳过标题行),为第一列创建目录,并在该目录内部为第二列创建另一个目录。

您的解决方案无效的原因是您曾两次致电list(zip(*f))。第一次执行导致文件句柄完全迭代。第二次执行导致一个空列表。

答案 2 :(得分:0)

Yay for arrays。不是最多" pythonic" ...但完成了我想要的。

try:
    with open('GROUP_NAMES.csv','r') as file:
        f = csv.reader(file, 
                          delimiter = ',', 
                          quotechar = '"')
        next(f)
        row = [row for row in f]
        for i in row:
            os.makedirs(i[0])
            file = open(i[0]+'\\'+i[1]+'.txt', 'w')


except:  

    f.close()  
    raise