社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

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

D. Joe • 5 年前 • 1608 次点击  

目前,我正在编写一些代码,以便在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
 
1608 次点击  
文章 [ 4 ]  |  最新文章 5 年前
Miguel Fabra
Reply   •   1 楼
Miguel Fabra    6 年前

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

list(data.keys())

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

谢谢你们的快速回复!

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

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

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

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

jpp
Reply   •   3 楼
jpp    6 年前

你可以使用 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    6 年前

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

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