Py学习  »  Python

python csv文件读取:将第一行转换为列标题,next(reader)返回不需要的字符

D. Joe • 4 年前 • 840 次点击  

目前,我正在编写一些代码,以便在csv文件中使用pandas读取,我需要将文件的第一行读取到一个列表中,以便用于一些描述(请参见代码部分1)。我可以用 熊猫.read_csv 参数 header=0 ,它自动读取列标题,但不返回列表afaik。在评论中 print() ,names是我用来手动将列标题传递到的列表 熊猫.read_csv 但我希望它是自动的(所以当我添加/删除列时,我不必手动编辑名称数组)。

所以,为了解决这个问题,我想出了一个主意,就是使用csv.reader单独读取第一行,并得到一个列名列表,我可以用这种方式在pandas.read_csv中使用(参见代码第2部分)。

第1部分熊猫csv数据的读取和打印描述

import pandas as pd
filename = 'test.csv'
dataheadsize = 10
data = pd.read_csv(filename, sep=";", header=0, decimal=",") 

用于在此处传递名称列表,而不是头=0

print('Descriptives:\n', data.describe(), '\n\n',
'Datasheet (', dataheadsize, 'rows shown):\n', data.head(dataheadsize),
#'Count per class:\n',data.groupby(names[0]).size(),'\n\n',
)

第2部分试图将csv的第一行读取到列表中

import csv
file = open(filename, 'r')
reader = csv.reader(file, delimiter=';')
names = next(reader)
print(names)

这给了我需要的列表,但由于某些原因,它在索引[0]处读取了一些额外的不需要的字符。这是由 打印() :

['VAR00001', 'VAR00002', 'VAR00003']

如你所见,我不想要那些  '要返回的字符,我想知道最好的方法是什么来避免这种情况,我希望它尽可能自动地供将来使用,这就是为什么我不想通过切片来删除字符,因为我不知道这些字符是否根据csv文件而改变,它们的数量是否改变,等等。

作为参考,这是.csv文件的前5行:

VAR00001;VAR00002;VAR00003
1;2;4
1;2;4
0;5;4
0;1;4

正如你现在可能知道的,我不是最有经验的编码员,所以如果有一种方法可以跳过整个“在csv中单独阅读只是为了将列名放入列表”的部分,请务必让我知道,因为我搞不懂!

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/50872
 
840 次点击  
文章 [ 4 ]  |  最新文章 4 年前
Miguel Fabra
Reply   •   1 楼
Miguel Fabra    5 年前

我不知道他们为什么加上这些字符,但为什么你不尝试:

list(data.keys())

D. Joe
Reply   •   2 楼
D. Joe    5 年前

谢谢你们的快速回复!

仅供参考,当我将编码改为utf-8时,我得到了这个列表

“\ufeffVAR00001”、“VAR00002”、“VAR00003”]

当我使用拉丁语-1时,它与我最初发布的列表相比没有任何变化。不过,我相信如果我找到了正确的编码,这是可行的。

但是,我使用的是list(data.keys()),这就像一个符咒,同时也完全不需要单独读取任何内容。感谢所有回应的人!

jpp
Reply   •   3 楼
jpp    5 年前

你可以使用 nrows 论证 pd.read_csv 要分别读取列标签:

# read in column labels as list
cols = pd.read_csv('file.csv', nrows=0).columns.tolist()

# read in data; use default pd.RangeIndex, i.e. 0, 1, 2, etc., as columns
data = pd.read_csv('file.csv', header=None, skiprows=[0])

如果需要指定编码,可以通过 encoding 论证,例如。 encoding='latin-1' .

SonOfLight
Reply   •   4 楼
SonOfLight    5 年前

如果所有其他操作都失败,您可以手动删除它。

def FixHeader(headerArr):
    newHeaderArr = []
    for i in range(len(headerArr)):
        if i == 0: 
            newHeaderArr.append(headerArr[i][1:])
            # 1 being how many chars you want to remove
        else:
            newHeaderArr.append(headerArr[i])
    #print(newHeaderArr)
    return newHeaderArr