【问题标题】:python csv file reading: turning the first row into column headers, next(reader) returns unwanted characterspython csv文件读取:将第一行变成列标题,next(reader)返回不需要的字符
【发布时间】:2019-01-22 08:58:46
【问题描述】:

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

因此,为了解决这个问题,我想出了一个想法,即使用 csv.reader 单独读取第一行并获得一个列名列表,我可以通过这种方式在 pandas.read_csv 中使用(参见代码第 2 部分) .

Part1 pandas csv读取和打印数据的描述

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

用于在此处传递名称列表而不是 header=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',
)

Part2 试图将 csv 的第一行读入列表

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

这为我提供了我需要的列表,但由于某种原因,它在索引 [0] 处读取了一些额外的不需要的字符。这是print()返回的内容:

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

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

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

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

您现在可能已经知道,我不是最有经验的编码员,所以如果有办法跳过整个“单独读取 csv 以将列名放入列表”部分,请务必让我知道,因为我想不通!

【问题讨论】:

  • 好像是编码错误,你能用file = open(filename, 'r', encoding='utf-8')试试吗?
  • 我怀疑文件是以不同的格式编码的。尝试添加编码格式,例如 latin 将 encoding ='latin1'。

标签: python pandas csv


【解决方案1】:

您可以使用pd.read_csvnrows 参数分别读取列标签:

# 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'.

【讨论】:

    【解决方案2】:

    如果一切都失败了,您可以手动删除它。

    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
    

    【讨论】:

      【解决方案3】:

      感谢大家的快速回复!

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

      ['\ufeffVAR00001', 'VAR00002', 'VAR00003']

      当我使用 latin-1 时,与我最初发布的列表相比,它没有任何改变。不过,我确信这会奏效,因为我找出了正确的编码。

      但是,我按照建议使用 list(data.keys()) ,它就像一个魅力,同时也完全消除了单独阅读任何内容的需要。非常感谢所有回复的人!

      【讨论】:

      • 我真的认为 data = pd.read_csv(filename, sep=";", header=0, decimal=",") colnames=list(data.columns) 会给你列名。你能试试吗?
      • 是的,list(data.columns) 产生与 list(data.keys()) 完全相同的输出
      【解决方案4】:

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

      list(data.keys())

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-02-01
        • 1970-01-01
        • 2015-04-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-02
        • 2016-12-29
        相关资源
        最近更新 更多