我有以下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个根文件夹就好了,所以我想我错过了在循环的同一次迭代中插入第二列变量的位置。
答案 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