numpy.loadtxt()

简介

np.loadtxt()用于从文本加载数据。
文本文件中的每一行必须含有相同的数据。

语法

loadtxt(fname, dtype=<class 'float'>, comments='#', delimiter=None, converters=None, skiprows=0, usecols=None, unpack=False, ndmin=0)

  • fname :要读取的文件、文件名、或生成器。

  • dtype :数据类型,默认float。

  • comments: 注释,如果行的开头为#就会跳过该行。

  • delimiter :分隔符,默认是空格。

  • skiprows: 跳过前几行读取,默认是0,必须是int整型。

  • usecols :要读取哪些列,0是第一列。例如,usecols = (1,4,5)将提取第2,第5和第6列。会把每一列当成一个向量输出, 而不是合并在一起。默认读取所有列。

  • unpack:如果为True,将分列读取。

  • 对数据进行预处理。

    我们可以先定义一个函数, 这里的converters是一个字典, 表示第零列使用函数add_one来进行预处理

    def add_one(x):
    	return int(x)+1  #注意到这里使用的字符的数据结构
    
    (a, b) = np.loadtxt('test.txt', dtype=int, skiprows=1, converters={0:add_one}, comments='#', delimiter=',', usecols=(0, 2), unpack=True)
    print(a, b)
    
    输出结果为:
    [2 5 8] [3 6 9]	#原结果为[1 4 7][3 6 9]
    

问题

今天在ipython中读取文件时,
代码为:

import numpy as np
x = np.loadtxt('C:\Users\sunshine\Desktop\scjym_3yNp3Gj\源数据\000001.csv',delimiter= ',',skiprows=(1),usecols= (1,4,6),unpack= False)```

出现下面的错误:

SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 2-3: truncated \UXXXXXXXX escape

看到这里我就明白自己错在哪儿了。编码错误,经搜索问题,发现采用如下解决方案:

1. 长字符串

非常长的字符串,跨多行时,可以使用***三个引号***代替普通引号。
即:

print('''This is a very long string.
it will continue.
and it's not over yet.
''hello,world''
still here.'''

可以注意到,使用这种方式时,字符串中可以同时使用单引号和双引号

2.原始字符串
print(r'c:\nwhere')

反斜线有特殊的作用,它会转义,可以帮助我们在字符串中加入单引号和双引号等不能直接加入的内容。\n,换行符,可以存放于字符串中。
以上代码块中,很显然我们是想要一个路径,而如果不使用原始字符串,我们就会得到

c:
where

对,为了防止这种情况,我们还可以使用反斜线进行转义,但是如果这个路径很长,就像本文的路径:
C:\\\Users\\\sunshine\\\Desktop\\\scjym_3yNp3Gj\\\源数据\\\000001.csv
使用双斜线,就会很麻烦。

这时,我们就可以用原始字符串。
原始字符串以r开头。

  • 原始字符串结尾不能是反斜线。
  • 如要结尾用反斜线,print(r'C:\Programfiles\foo\bar' '\\')C:\Programfiles\foo\bar\

在常规python字符串中,\U字符组合表示扩展的Unicode代码点转义。因此这里出现了错误。

python导入csv文件的三种方法


#原始的方式

lines = [line.split(',') for line in open('iris.csv')]
df = [[float(x) for x in line[:4]] for line in lines[1:]]

#使用numpy包

import numpy as np
lines = np.loadtxt('iris.csv',delimiter=',',dtype='str')
df = lines[1:,:4].astype('float')

#使用pandas包

import pandas as pd
df = pd.read_csv('iris.csv')
df=df.ix[:,:4]

这三种方法中最后一种最简单,不过花费时间比较长一点,第一种最麻烦,不过用时最短。这个可以通过ipython中的magic函数%%timeit来看。

——————————————
原文链接:https://www.jianshu.com/p/ef37f739b531