python讀寫csv文件


1用python做數據分析,數據來源一般會有多種格式,而我喜歡以CSV的方式進行存儲分析,如果數據本身就是CSV格式的那我可以直接用pandas庫自帶的方法進行讀取即可,但是有時候各種來源的數據不方便用pandas進行直接分析處理,所以就有了一個通用的讀寫CSV文件的方法。

#1導入相關包
import os
import re
import csv
#1讀取csv文件
def read_csv(filename, header=False):
    res = []
    with open(filename) as f:
        f_csv = csv.reader(f)
        if header:#默認讀取頭部文件
            headers = next(f_csv)
            header = False
        for row in f_csv:
            res.append(row)
    return res
#2寫入csv文件
def write_csv(data, filename):
    with open(filename, "wb") as f:
        f_csv = csv.writer(f)
        #一行一行寫入
        for item in data:
            f_csv.writerow(item)

2.有時候文件是txt或者從hive等數據庫導出來的格式則可以用下面的方法讀取數據並進行分析

#3讀取文本格式
def read_text(filename, columns, delimeter):
    #columns:多少列
    #delimeter:分隔符
    res = []
    with open(filename, "rb") as f:
        while True:
            line = f.readline()
            if line:
                line = re.sub("[\r\n]", "", line)#清楚換行符
                lines = line.split(delimeter)
                if len(lines) != columns:
                    continue
                res.append(lines)
            else:
                break
    return res

3.也可以用numpy直接進行讀取文件格式:loadtxt(fname, dtype=float,delimiter=None,skiprows=0, usecols=None, unpack=False)fname:文件名,dtype:數據類型,也可使是str,delimiter:分隔符,skiprows:跳過開頭幾行,usecols:讀取某一列或者幾列的值比如(0,3)表示讀取第一和四列的值。
例子:npload.txt
  40920 8.326976 0.953952 3 qwe
  14488 7.153469 1.673904 2 aad
  26052 1.441871 0.805124 1 zc
  75136 13.147394 0.428964 1 wed

import numpy as np
filename = "E:/PythonProject/CommonFunction/input/npload.txt"
res = np.loadtxt(filename,dtype=str,delimiter="\t",skiprows=1,usecols=(0,3,4),unpack=False)
print type(res)
print res
x,y,z = np.loadtxt(filename,dtype=str,delimiter="\t",skiprows=1,usecols=(0,3,4),unpack=True)
print x#第一列
print y#第四列
print z#第五列

結果:

<type 'numpy.ndarray'>
[['14488' '2' 'aad']
 ['26052' '1' 'zc']
 ['75136' '1' 'wed']]
['14488' '26052' '75136']
['2' '1' '1']
['aad' 'zc' 'wed']

4.pandas也是一個強大的數據分析工具,直接讀取csv,excel文件,或者吧pandas的DataFrame直接存儲為csv或者excel格式:例如把上面的數據可以通過write_csv()方法存儲為csv格式,然后可以直接用pandas讀取。
pd.read_csv(filename, header=None, index_col=0, usecols=(1,2,3), skiprows=0)參數和np.loadtxt()參數解釋基本是一樣的。read_excel(io,sheet_name=0,header=0,index_col=None,usecols=None,dtype=None,skiprows=None)常用的參數解釋都是一樣的。相應的存儲方法則是to_csv()和to_excel()

import pandas as pd
filename="E:/PythonProject/CommonFunction/input/npload.csv"
df = pd.read_csv(filename, header=None, index_col=0, usecols=(1,2,3), skiprows=0)
print df.head()

結果:

                 2  3
1                     
8.326976   0.953952  3
7.153469   1.673904  2
1.441871   0.805124  1
13.147394  0.428964  1
5.用的着的小技巧:pandas的pivot方法和numpy的permutation
df = pd.DataFrame({'foo': ['one', 'one', 'one', 'two', 'two',
...                            'two'],
...                    'bar': ['A', 'B', 'C', 'A', 'B', 'C'],
...                    'baz': [1, 2, 3, 4, 5, 6],
...                    'zoo': ['x', 'y', 'z', 'q', 'w', 't']})
print df
df.pivot(index='foo', columns='bar', values='baz')#以foo為索引列,以bar列為行,zoo列為值,注(foo, bar)不能重復

結果

bar  baz  foo zoo
0   A    1  one   x
1   B    2  one   y
2   C    3  one   z
3   A    4  two   q
4   B    5  two   w
5   C    6  two   t
bar A B C
foo
one 1 2 3
two 4 5 6
np.random.seed(0)
print np.random.permutation(10)#將0-9隨機打亂,可用於隨機取數據集
x = range(10)
np.random.shuffle(x)#洗牌,參數需要是一個可迭代的對象
print x
[2 8 4 9 1 6 7 3 0 5]
[3, 5, 1, 2, 9, 8, 0, 6, 7, 4]
注:當然也可以用sklearn的train_test_split方法分割數據集
from sklearn.model_selection import train_test_split
train_set,test_set = train_test_split(SampleData, test_size=0.2, random_state=42)
如果數據集含有標簽,可以和標簽一塊分割 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=42)
 
       

 

關注公眾號

免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2023 CODEPRJ.COM