Python 學習 第十三篇:數據的讀寫-文件、DataFrame、json和pymssql
Python的文件是一個重要的對象,使用open()函數來打開文件,創建文件對象,進行文件的讀寫操作。當數據用於交換信息時,通常需要把數據保存為有格式的文本數據,可以保存為有特定的行分隔符和列分隔符的數據,這可以使用pandas模塊中的函數來讀寫;也可以保存為json結構的數據,這可以使用json模塊中的函數來實現;對於大型的數據交互,通常使用數據庫。
一,Python的open函數
open()函數用於打開文件,創建文件對象:
open(name, mode, encoding=None)
參數註釋:
name是文件名,包括路徑
encoding 是編碼方式,常用的編碼方式是utf-8
mode是打開文件的模式,最常用的模式是:
- r:只讀模式,表示打開文件是為了從文件的開頭讀取文件中的數據;
- w:只寫模式,表示打開文件是為了向文件寫入數據。如果該文件已存在,那麽打開該文件,刪除原有的內容,從文件開頭開始寫入;如果該文件不存在,那麽創建新的文件。
open()函數創建一個file 對象,文件對象的主要方法:
- file.read([size]):size 未指定則返回整個文件,如果文件大小 >2 倍內存則有問題,f.read()讀到文件尾時返回""(空字串)。
- file.readline():只讀取一行。
- file.readlines([size]) :返回包含size行的列表, size 未指定則返回全部行。
- for line in f: print( line ):通過叠代器訪問。
- f.write("hello\n"):如果要寫入字符串以外的數據,先將他轉換為字符串。
- f.close() 關閉文件
1,讀取文件
調用open()函數打開一個文件,設置mode=‘r‘,表示打開文件是為了讀取文件中的數據,調用文件對象的函數或叠代器來逐行讀取數據:
file = open(‘test.txt‘,‘r‘,encoding=‘utf-8‘) lines = [line.strip() for line in file] file.close()
註意:打開文件之後,完成文件的讀寫之後,必須調用文件對象的close()方法,最終關閉文件。
2,寫入文件
調用open()函數打開一個文件,如果設置mode=‘w‘,那麽表示打開文件是為了向文件中寫入數據,調用文檔對象的write(‘content‘)函數向文檔中寫入內容。
file = open(‘test.txt‘,‘w‘,encoding=‘utf-8‘) file.write(‘write content to file‘) file.close()
註意:打開文件之後,完成文件的讀寫之後,必須調用文件對象的close()方法,最終關閉文件。
3,文件的關閉
調用open()函數打開一個文件,是把文件讀取到內存中的,如果不及時關閉文件,文件對象就會一直占用系統資源,除了調用文件對象的close()方法關閉文件之外,還可以使用 with open(),由系統自動關閉文件:
with open(‘test.txt‘,‘r‘,encoding=‘utf-8‘) as file: lines = [line.strip() for line in file]
二,pandas模塊
pandas模塊提供了一些用於把表格型數據讀取為DataFrame對象的函數。
1,格式化數據的讀取
read_csv:從文件、URL、文件型對象中加載帶分隔符的數據,默認的分隔符是逗號。
read_table:從文件、URL、文件型對象中加載帶分隔符的數據,默認的分隔符是制表符(\t)。
參數註釋:
- path:要讀取的文件的位置
- sep:用於對行中各字段進行拆分的字符序列或正則表達式
- header:用作列名的行號,默認值是0,如果沒有header行,設置為None
- index_col:用於行索引的列編號
- names:用於自定義列名列表,結合header=None
- na_values:一組用於替換NA的值
- iterator:返回一個TextParser以便逐塊讀取文件
- chunksize:文件的大小,用於叠代
- nrows:需要讀取的行數,從文件開始處計算
2,輸出數據
利用DataFrame的to_csv方法,可以把數據寫到一個以逗號分隔的文件中
DataFrame.to_csv(path_or_buf=None, sep=‘, ‘, na_rep=‘‘, float_format=None, columns=None, header=True, index=True, index_label=None, mode=‘w‘, encoding=None, compression=None, quoting=None, quotechar=‘"‘, line_terminator=‘\n‘, chunksize=None, tupleize_cols=None, date_format=None, doublequote=True, escapechar=None, decimal=‘.‘)
常用參數註釋:
- path_or_bu:輸出文件的路徑,或者設置sys.stdout
- sep:行中個字段的分隔符,默認是逗號
- na_rep:替換缺失數據的字符
- columns:列名列表
- header:是否輸出header,默認值是True
- index:是否輸出索引,默認是True
- line_terminator:列分隔符
三,json
Python中的json對象實際是一個字典結構,用於存儲和交換信息,導入json模塊:
import json
1,把字符串轉換為json
json的load()方法用於把josn格式的字符串轉換為json對象,這實際上是一個字典結構:
json_string= ‘{ "name":"John", "age":30, "city":"New York"}‘ # parse string to json json_obj = json.loads(json_string)
2,把字典轉換為json字符串
json的dumps()函數用於把字典結構轉換為json格式的字符串。
x = { "name": "John", "age": 30, "city": "New York" } # convert dict into JSON string: json_string = json.dumps(x)
四,關系型數據庫
使用pymssql連接SQL Server數據庫,首先創建連接和遊標:
import pymssql conn = pymssql.connect(host=‘host‘,user=‘user‘,password=‘pwd‘,database=‘db_name‘) cursor = conn.cursor()
當執行select語句獲得數據時,返回的數據集有兩種格式:元組和字典,這需要在創建遊標時設置,as_dict的默認值是False。
cursor = conn.cursor(as_dict=True)
1,執行數據更新和刪除
通過遊標的execute()函數來執行TSQL語句,調用 commit() 來提交事務
cursor.execute(""" sql statement """) conn.commit()
2,執行數據的多行插入
使用遊標的executemany()函數來插入多行數據
cursor.executemany( "INSERT INTO persons VALUES (%d, %s, %s)", [(1, ‘John Smith‘, ‘John Doe‘), (2, ‘Jane Doe‘, ‘Joe Dog‘), (3, ‘Mike T.‘, ‘Sarah H.‘)]) conn.commit()
3,遍歷數據
當從SQL Server數據庫中獲取數據時,使用遊標的fetchone()函數,以叠代方式返回結果集的一行數據。
cursor.execute(‘SELECT * FROM persons WHERE salesrep=%s‘, ‘John Doe‘) # 遍歷數據(存放到元組中) 方式1 row = cursor.fetchone() while row: print("ID=%d, Name=%s" % (row[0], row[1])) row = cursor.fetchone() # 遍歷數據(存放到元組中) 方式2 for row in cursor: print(‘row = %r‘ % (row,)) # 遍歷數據(存放到字典中) # cursor = conn.cursor(as_dict=True) # cursor.execute(‘SELECT * FROM persons WHERE salesrep=%s‘, ‘John Doe‘) # for row in cursor: # print("ID=%d, Name=%s" % (row[‘id‘], row[‘name‘]))
4,關閉連接
當查詢完成之後,一定要關閉連接:
conn.close()
使用with來自動關閉連接:
import pymssql server = "187.32.43.13" user = "root" password = "1234" with pymssql.connect(server, user, password, "db_name") as conn: with conn.cursor(as_dict=True) as cursor: # 數據存放到字典中 cursor.execute(‘SELECT * FROM persons WHERE salesrep=%s‘, ‘John Doe‘) for row in cursor: print("ID=%d, Name=%s" % (row[‘id‘], row[‘name‘]))
參考文檔:
Python之文件讀寫
pandas系列 read_csv 與 to_csv 方法各參數詳解(全,中文版)
Python JSON
python連接sql server數據庫實現增刪改查
Python 學習 第十三篇:數據的讀寫-文件、DataFrame、json和pymssql