1. 程式人生 > >Python 學習 第十三篇:數據的讀寫-文件、DataFrame、json和pymssql

Python 學習 第十三篇:數據的讀寫-文件、DataFrame、json和pymssql

獲得 use 字串 刪除 int parser write 大小 new

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