我有数百个csv文件。每个人不必像下面那样拥有相同的标题。
CSV1:
G,B,C,D
1,2,3,4
2,4,5,6
CSV2:
A,C,D
1,2,6
2,5,7
我想按名称调用每一列,如下所示: 如果文件有列A:选择该列 else:跳到下一个必需列(可能是B)并对每个文件重复相同的过程,直到引用了所有必需的列。如果你能帮我这么做,我真的很感激。
答案 0 :(得分:0)
解决方案1:使用csv
模块的DictReader
。
解决方案2:如果您的数据确实是数字,如您的示例所示,您可以使用numpy.genfromtxt
生成结构化数组:http://docs.scipy.org/doc/numpy/user/basics.rec.html
答案 1 :(得分:0)
使用所需的列名称调用以下函数,并返回属于此列的所有值的列表:
import csv
file = 'c:\\temp\\test.csv'
def GetValuesFromColumn(title):
values = []
rownum = 0
with open(file, 'r') as f:
reader = csv.reader(f)
for row in reader:
if rownum == 0:
index = row.index(title)
rownum = 1
else:
values.append(row[index])
return values
values = GetValuesFromColumn('D')
答案 2 :(得分:0)
如果你喜欢熊猫的方法,这里有一个选择。它打开每个文件,抓取一行,查看列并查看是否有任何列名称在所需列表中。如果我们想要任何列,则将csv读入Pandas DataFrame
示例数据:
df = pd.DataFrame( [(2014, 30, 15), (2015, 10, 20), (2007, 5, 3)] )
df.columns = ['year','a','b']
df.set_index('year', inplace=True)
df.to_csv('tst.csv')
df.columns = ['c','z']
df.to_csv('tst2.csv')
做好工作:
导入glob
wanted = ['year','a','z']
path = '.'
allFiles = glob.glob(path + "/*.csv")
for file in allFiles:
#grab only one row for testing
df = pd.read_csv(file, nrows=1)
includedCols = []
for x in wanted:
if x in df.columns:
includedCols.append(x)
if len(includedCols) > 0:
df = pd.read_csv(file, usecols = includedCols)
print df
## do something with df here
答案 3 :(得分:0)
创建一个像普通读者一样操作的对象,但将读取的信息映射到一个字典,其中的键由可选的fieldnames参数给出。
如果省略fieldnames参数,则csvfile第一行中的值将用作字段名。
例如
import csv
def get_values_for_column(csvfile, col):
with open(csvfile, 'rb') as f:
reader = csv.DictReader(f)
values = [row[col] for row in reader]
return values
# Usage
>> get_values_for_column('CSV1.csv', 'D')
# prints [4, 6]
根据Alan和Aldervan的答案