这个问题之前已经讨论过了。在loadtxt(或genfromtxt)中没有一个参数可以做你想要的事情。换句话说,它不是引号敏感的。pythoncsv模块有某种引号感知。pandas读取器也是引号感知的。 但是在将行传递给loadtxt之前对其进行处理是完全可以接受的。函数所需要的只是一个可迭代对象--一次可以输入一行的对象。可以是文件、行列表或生成器。 一个简单的处理器只需要将引号内的逗号替换为其他字符,或者将引号外的逗号替换为你选择的逗号,这并不需要花太多的心思。 Using numpy.genfromtxt to read a csv file with strings containing commas 举例来说:
txt = """10,"Apple, Banana",20
30,"Pear, Orange",40
50,"Peach, Mango",60
"""
def foo(astr):
# replace , outside quotes with ;
# a bit crude and specialized
x = astr.split('"')
return ';'.join([i.strip(',') for i in x])
txt1 = [foo(astr) for astr in txt.splitlines()]
txtgen = (foo(astr) for astr in txt.splitlines()) # or as generator
# ['10;Apple, Banana;20', '30;Pear, Orange;40', '50;Peach, Mango;60']
np.genfromtxt(txtgen, delimiter=';', dtype=None)
def transformCommas(line):
out = ''
insideQuote = False
for c in line:
if c == '"':
insideQuote = not insideQuote
if insideQuote == True and c == ',':
out += '.'
else:
out += c
return out
f = open("data/raw_data_all.csv", "rb")
replaced = (transformCommas(line) for line in f)
rawData = numpy.loadtxt(replaced,delimiter=',', skiprows=0, dtype=str)
6条答案
按热度按时间up9lanfz1#
使用一个numpy函数调用的一种方法是使用
np.fromregex
,它允许您使用Python的regular expression syntax以任意方式解析文本文件的内容。例如:字符串
为您提供:
型
为了对正则表达式进行一点解压缩,
'(\d+)'
将匹配一个或多个数字,'"(.+)"'
将匹配双引号内的一个或多个字符。np.fromregex
尝试在.csv
文件的每一行中匹配此表达式,括号内的部分将作为输出数组每行中的单个元素。如果你想要一个记录数组作为你的输出,在
.csv
文件中的三个“列”有不同的“字段”,你可以为正则表达式中的每组括号指定单独的dtypes
:型
为您提供:
型
doinxwow2#
这个问题之前已经讨论过了。在
loadtxt
(或genfromtxt
)中没有一个参数可以做你想要的事情。换句话说,它不是引号敏感的。python
csv
模块有某种引号感知。pandas
读取器也是引号感知的。但是在将行传递给
loadtxt
之前对其进行处理是完全可以接受的。函数所需要的只是一个可迭代对象--一次可以输入一行的对象。可以是文件、行列表或生成器。一个简单的处理器只需要将引号内的逗号替换为其他字符,或者将引号外的逗号替换为你选择的逗号,这并不需要花太多的心思。
Using numpy.genfromtxt to read a csv file with strings containing commas
举例来说:
字符串
生产:
型
我以前没有注意过
np.fromregex
。与genfromtxt
相比,它出奇的简单。要与我的示例txt
一起使用,我必须使用字符串缓冲区:型
它的行动归结为:
型
它读取整个文件(
f.read()
)并执行findall
,这应该会产生一个列表,如下所示:型
元组列表正是结构化数组所需要的。
没有花哨的处理,错误检查或过滤注解行。只是一个模式匹配,然后是数组构造。
我的
foo
和fromregex
都假设了一个特定的数字序列和带引号的字符串。csv.reader
可能是最简单的通用引号读取器。join
是必需的,因为reader
生成一个列表的列表,而genfromtxt
想要一个字符串的可迭代对象(它自己进行“拆分”)。型
生产
型
或者在下面的
fromregex
示例中,reader
输出可以转换为元组列表并直接提供给np.array
:fdx2calv3#
我用下面的代码解决了这个问题。
字符串
数据类型:
型
fumotvh34#
您可以使用Python csv 模块:https://docs.python.org/2/library/csv.html
给定一个CSV格式的数据文件:
字符串
使用此脚本:
型
您将获得:
型
由于loadtxt需要一个可迭代对象,因此传递它
reader(f)
:型
bwntbbo35#
虽然numpy.loadtxt中没有这样的参数来忽略引号或转义逗号,但还没有建议的一种替代方案是以下...
执行查找和替换使用一些文本编辑器替换逗号与制表符或保存文件在Excel中作为制表符分隔。
当您使用numpy.loadtxt时,您只需指定
delimiter='\t'
而不是逗号分隔。简单的解决方案,可以保存你一些代码.
odopli946#
从numpy 1.23.0版本开始,您现在可以使用参数
quotechar
来实现此效果。你可以这样使用它:
字符串
来自numpy.loadtext的文档:
quotechar:unicode字符或None,可选
用于表示引用项的开始和结束的字符。引用项中出现的引号或注解字符将被忽略。默认值为quotechar=None,表示禁用引用支持。
如果在一个带引号的字段中发现两个连续的quotechar示例,则第一个被视为转义字符。