背景
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
,將分列讀取。
問題
今天在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
編碼錯誤,經搜索問題,發現采用如下解決方案:
r'C:\Users\expoperialed\Desktop\Python'
'C:\\Users\\expoperialed\\Desktop\\Python'
'C:/Users/expoperialed/Desktop/Python'
看到這里我就明白自己錯在哪兒了。
書寫字符串有幾個需要注意的地方:
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
來看。