Python 从CSV中读取两列变量,同时对这两列做些什么?
我有以下内容:Python 从CSV中读取两列变量,同时对这两列做些什么?,python,python-3.x,loops,csv,multiple-columns,Python,Python 3.x,Loops,Csv,Multiple Columns,我有以下内容: 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
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个根文件夹很好,所以我想我错过了在循环的同一次迭代中插入第二列变量的机会 我认为你把问题复杂化了 下面是我写的一个快速解决方案:
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))
。第一次执行导致文件句柄被完全迭代。第二次执行导致一个空列表。我认为您将问题复杂化了
下面是我写的一个快速解决方案:
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))
。第一次执行导致文件句柄被完全迭代。第二次执行导致一个空列表。对数组来说是的。不是最“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
对数组来说是的。不是最“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
看起来问题在于列表只有一个索引,其中包含一组设置值,如下所示:
[('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))
看起来问题在于列表只有一个索引,其中包含一组设置值,如下所示:
[('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))
也许我的演示太简单了。假设我使用第二列变量来做一些完全不同的事情,比如,用col[1]中的值创建一个文本文件——同一行……或者更复杂的,削土豆皮之类的东西。您的代码示例确实有用,仅供参考。我编辑了这篇文章。也许我把我的演示做得太简单了。假设我使用第二列变量来做一些完全不同的事情,比如,用col[1]中的值创建一个文本文件——同一行……或者更复杂的,削土豆皮之类的东西。您的代码示例确实有用,仅供参考。我编辑了OP。你不需要那个行数组。您可以直接循环文件的其余行,而不需要该行数组。您可以直接循环文件的其余行