当前位置: 首页 > 面试题库 >

在numpy中读取CSV文件,其中分隔符为“,”

曹铭晨
2023-03-14
问题内容

我有一个CSV文件,其格式如下:

“ FieldName1”,“ FieldName2”,“ FieldName3”,“ FieldName4”
“ 04/13/2010 14:45:07.008”,“ 7.59484916392”,“ 10”,“ 6.552373”
“ 04/13/2010 14:45:22.010 ”,“ 6.55478493312”,“ 9”,“ 3.5378543”


请注意,CSV文件中每行的开头和结尾都有双引号字符,并且该","字符串用于分隔每行中的字段。CSV文件中的字段数可能因文件而异。

当我尝试通过以下方式
import numpy as np
data = np.genfromtxt(csvfile, dtype=None, delimiter=',', names=True)
将其读取为numpy时:所有数据都以字符串值的形式读取,并用双引号引起来。并非没有道理,但对我来说并没有太大用处,因为我不得不回头将每一列转换为正确的类型

当我改用时delimiter='","' 第一个和最后一个字段
,所有内容均按我的意愿工作。由于线和行尾字符的起点是一个双引号字符,这是没有看到作为第一个和最后一个字段中输入有效的分隔符,使他们获得在读作如"04/13/2010 14:45:07.0086.552373"-记前缘和后双分别引用字符。由于存在这些冗余字符,因此numpy假设第一个字段和最后一个字段均为String类型;我不希望那样

有没有一种方法可以指示numpy读取我想要的以这种方式格式化的文件,而不必在初始读取后返回并“修复” numpy数组的结构?


问题答案:

基本的问题是NumPy不了解剥离引号的概念(而csv模块可以理解)。当您说时delimiter='","',您是在告诉NumPy,列定界符实际上是带引号的逗号,即引号是逗号周围的值,而不是值,因此,您期望在第一列和最后一列上获得的额外引号都可以。

查看函数文档,我认为您需要设置converters参数以为您去除引号(默认值不是):

import re
import numpy as np

fieldFilter = re.compile(r'^"?([^"]*)"?$')
def filterTheField(s):
    m = fieldFilter.match(s.strip())
    if m:
        return float(m.group(1))
    else:
        return 0.0 # or whatever default

#...

# Yes, sorry, you have to know the number of columns, since the NumPy docs
# don't say you can specify a default converter for all columns.
convs = dict((col, filterTheField) for col in range(numColumns))
data = np.genfromtxt(csvfile, dtype=None, delimiter=',', names=True, 
    converters=convs)

或者放弃np.genfromtxt(),让csv.csvreader您一次以字符串列表的形式一次给您文件的内容,然后您只需遍历元素并构建矩阵:

reader = csv.csvreader(csvfile)
result = np.array([[float(col) for col in row] for row in reader])
# BTW, column headings are in reader.fieldnames at this point.

编辑:好的,看起来您的文件不是全部​​浮动。在这种情况下,您可以convs根据需要进行设置genfromtxt,或者在情况下创建转换函数向量csv.csvreader

reader = csv.csvreader(csvfile)
converters = [datetime, float, int, float]
result = np.array([[conv(col) for col, conv in zip(row, converters)] 
    for row in reader])
# BTW, column headings are in reader.fieldnames at this point.

编辑2:好的,可变的列数…您的数据源只是想让生活变得困难。幸运的是,我们可以使用magic

reader = csv.csvreader(csvfile)
result = np.array([[magic(col) for col in row] for row in reader])

…在这里magic()我只是想起一个函数而已。(精神!)

最坏的情况是:

def magic(s):
    if '/' in s:
        return datetime(s)
    elif '.' in s:
        return float(s)
    else:
        return int(s)

也许NumPy具有接受字符串并返回具有正确类型的单个元素的函数。
numpy.fromstring()看起来很近,但它可能会将时间戳中的空间解释为列分隔符。

PScsvreader我看到的一个缺点是它不会丢弃评论。真实csv文件没有评论。



 类似资料:
  • 问题内容: 我有一个逗号分隔的CSV文件,其中包含NASDAQ符号。我使用扫描仪读取文件 我在第二个字段上遇到异常。问题是,该字段与文件中的其他某些字段一样也包含逗号,例如“ 1-800 FLOWERS.COM,Inc.”: 如何避免这个问题?我的代码是: 谢谢 问题答案: 除非这是家庭作业,否则您不应该自己解析CSV。使用现有库之一。例如: http //commons.apache.org/s

  • 我的文件内容如下: 我需要在分隔符“”处拆分我的文件。并将前面的内容保存在字符串中。我怎么能那么做?我尝试了以下方法,但不起作用

  • 如何捕捉此字段中的而不将其视为CSV分隔符?

  • 目标:创建一个面向对象的图形Java应用程序,该程序将:读取一个CSV(逗号分隔值)文件,该文件由学生姓名(名字、姓氏)、ID以及内容和交付的初始标记组成(未评估学生使用-1值)。 这是我的代码,但当我点击选择文件。。当它真的应该打开文件并读取数据时,它会显示“预期的名字、姓氏、ID、内容和交付”。但不知何故,它不起作用。在此处输入图像描述 下面是我的代码: 私有类ChooseFileListen

  • 问题内容: 我有一种情况,我必须解析来自不同来源的CSV文件,解析代码非常简单明了。 我的问题来自CSV分隔符,我有许多不同的格式,有时是有时是 有什么方法可以在解析文件之前确定定界符 问题答案: univocity-parsers支持自动检测定界符(也包括行尾和引号)。只需使用它而不是与您的代码作斗争: 免责声明:我是该库的作者,并且确保确保涵盖了各种极端情况。它是开源且免费的(Apache 2