欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python常見讀寫文件操作實(shí)例總結(jié)【文本、json、csv、pdf等】

 更新時(shí)間:2019年04月15日 09:22:28   作者:微信1257309054  
這篇文章主要介紹了Python常見讀寫文件操作,結(jié)合實(shí)例形式總結(jié)分析了Python常見的各種文件讀寫操作,包括文本、json、csv、pdf等文件的讀寫與相關(guān)注意事項(xiàng),需要的朋友可以參考下

本文實(shí)例講述了Python常見讀寫文件操作。分享給大家供大家參考,具體如下:

讀寫文件

讀寫文件是最常見的IO操作,python內(nèi)置了讀寫文件的函數(shù),用法和c是兼容的.

讀寫文件前,我們必須了解一下,在磁盤上讀寫文件的功能都是由操作系統(tǒng)提供的,現(xiàn)代操作系統(tǒng)不允許普通的程序直接操作磁盤,所以讀寫文件就是請(qǐng)求操作系統(tǒng)打開一個(gè)文件對(duì)象(文件描述),然后,通過操作系統(tǒng)提供的接口從這個(gè)文件對(duì)象中讀取數(shù)據(jù)(讀文件),或者把數(shù)據(jù)寫入這個(gè)文件對(duì)象(寫文件).

1、讀文件

要以讀文件的模式打開一個(gè)文件對(duì)象,使用python內(nèi)置的open()函數(shù),傳入文件名和標(biāo)識(shí)符:

f = open("t1.txt","r",encoding="utf-8")

標(biāo)識(shí)符'r'表示讀。

如果文件不存在,open()函數(shù)就會(huì)拋出一個(gè)IOError的錯(cuò)誤,并且會(huì)給出詳細(xì)的錯(cuò)誤碼和信息,告訴你文件不存在。

f = open("t122.txt","r",encoding="utf-8")

Traceback (most recent call last):
  File "D:/Learn/python/day14/test.py", line 1, in <module>
    f = open("t122.txt","r",encoding="utf-8")
FileNotFoundError: [Errno 2] No such file or directory: 't122.txt'

如果文件打開成功,接下來,調(diào)用read()方法可以一次性讀取文件的全部?jī)?nèi)容,python把內(nèi)容讀取到內(nèi)存,用一個(gè)str對(duì)象表示。

print(f.read())

輸出:

hello world!

最后一步調(diào)用close()方法關(guān)閉文件,文件使用完畢之后必須關(guān)閉,因?yàn)槲募?duì)象會(huì)占用操作系統(tǒng)的資源,并且操作系統(tǒng)同一時(shí)間能打開的文件數(shù)量也是有限制的。

f.close()

f = open(r"文件地址","讀取方式",encoding="utf-8")

"r":以只讀方式
encoding:讀取的編碼格式
f.read() :一次性讀取文件全部?jī)?nèi)容
f.close():關(guān)閉流
r"文件地址":不讓轉(zhuǎn)義字符“\”起作用

由于文件讀寫都有可能產(chǎn)生IOError,一旦出錯(cuò),后面的f.close()就不會(huì)調(diào)用,所以,為了保證文件不管是否執(zhí)行出錯(cuò)都能夠正確的關(guān)閉文件,我們可以使用try … finally來實(shí)現(xiàn).

try:
 f = open("t1.txt", "r", encoding="utf-8")
 print(f.read())
finally:
 if f:
  f.close() 

但是每次都這么寫實(shí)在太繁瑣,所以,引入了with語句來自動(dòng)幫我們調(diào)用close()方法:

with open("t1.txt", "r", encoding="utf-8") as f:
 print(f.read())

這和前面的try…finally是一樣的,但是代碼更加簡(jiǎn)潔,并且不必調(diào)用f.close()方法。

注意: 使用read()會(huì)一次性讀取文件的全部?jī)?nèi)容,如果你的文件特別大,比如說有5G,那么你的內(nèi)存就爆了,所以,為了保險(xiǎn)起見,我們可以反復(fù)調(diào)用read(size)方法,每次最多讀取size個(gè)字節(jié)內(nèi)容,另外調(diào)用readline()可以每次讀取一行內(nèi)容,調(diào)用readlines()一次性讀取所有的內(nèi)容,并按行返回list,因此,要根據(jù)需要決定怎么調(diào)用。

如果文件很小,read()一次讀取最方便,如果不能確定文件大小,反復(fù)調(diào)用read(size)比較保險(xiǎn),如果是配置文件,調(diào)用readlines()最方便。

for line in f.readlines():
 #把末尾的'\n'刪掉
 print(line.strip())

2、二進(jìn)制文件

前面講的默認(rèn)都是讀取文本文件,并且是UTF-8編碼的文本文件,要讀取二進(jìn)制文件,比如圖片,視頻等等,用'rb'模式打開文件即可:

f = open("tigle.jpg", "rb")
print(f.read())
b'\xff\xd8\xff\xe1\x00\x18Exif\x00\x00...' # 十六進(jìn)制表示的字節(jié)

3、字符編碼

要讀取非UTF-8編碼的文本文件,需要給open()函數(shù)傳入encoding參數(shù),例如,讀取GBK編碼的文件:

f = open('/user/demo/gbk.txt','r',encoding = 'gbk')
f.read()
'測(cè)試'

遇到有些編碼不規(guī)范的文件,你可能遇到UnicodeDecodeError,因?yàn)樵谖谋疚募锌赡軍A雜了一些非法編碼的字符,遇到這種情況,open()函數(shù)還接收一個(gè)error參數(shù),表示如果遇到編碼錯(cuò)誤之后如何處理,最簡(jiǎn)單的辦法就是直接忽略。

f = open('/users/demo/gbk.txt','r',encoding = 'gbk',errors = 'ignore')

4、寫文件

寫文件和讀文件都是一樣的,唯一的區(qū)別就是調(diào)用open()函數(shù)時(shí),傳入標(biāo)識(shí)符'w'或者'wb'表示寫文件或?qū)懚M(jìn)制文件:

f = open("/users/demo/test.txt",'w')
f.write('hello, world!')
f.close()

你可以反復(fù)調(diào)用write()來寫入文件,但是務(wù)必要調(diào)用f.close()來關(guān)閉文件.

當(dāng)我們寫入文件時(shí),操作系統(tǒng)往往不會(huì)立刻把數(shù)據(jù)寫入磁盤,而是放到內(nèi)存緩存起來,空閑的時(shí)候再慢慢寫入,只有調(diào)用close()方法時(shí),操作系統(tǒng)才保證把沒有寫入的數(shù)據(jù)全部寫入磁盤,忘記調(diào)用close()的后果是數(shù)據(jù)可能只寫了一部分到磁盤,剩余的丟失了,所以,還是使用with語句來的保險(xiǎn):

with open('/users/demo/test.txt', 'w') as f:
 f.write('hello, world')

要寫入特定編碼的文本文件,請(qǐng)給open()函數(shù)傳入encoding參數(shù),將字符串自動(dòng)轉(zhuǎn)成指定編碼。

以'w'模式寫入文件時(shí),如果文件已經(jīng)存在,直接覆蓋(相當(dāng)于刪掉后新寫入一個(gè)文件),如果我們希望追加到文件的末尾怎么辦?可以傳入'a'以追加模式寫入。

with open('/users/demo/test.txt', 'a') as f:
 f.write('hello, world')

5、StringIO

很多時(shí)候,數(shù)據(jù)讀寫不一定是文件,也可以在內(nèi)存讀寫.

stirngIO顧名思義就是在內(nèi)存中讀寫str。

要把str寫入StringIO,我們需要先創(chuàng)建一個(gè)StringIO,然后,像文件一樣寫入即可:

from io import StringIO
f = StringIO()
f.write("hello")
f.write(" ")
f.write('world')
#獲取寫入后的str
print(f.getvalue())

輸出:

hello world

要讀取StringIO,可以用一個(gè)str初始化StringIO,然后,像讀文件一樣讀取:

from io import StringIO
f = StringIO("Hello\nHi\nGoodBye!")
while True:
 s = f.readline()
 if s == '':
  break
 # 去掉換行符
 print(s.strip())

輸出:

Hello
Hi
GoodBye!

6、BytesIO

StringIO操作的只能是str,如果要操作二進(jìn)制數(shù)據(jù),就需要使用BytesIO。

BytesIO實(shí)現(xiàn)了在內(nèi)存中讀寫bytes,我們創(chuàng)建一個(gè)BytesIO,然后寫入一些bytes:

from io import BytesIO
f = BytesIO()
f.write("中文".encode('utf-8'))
print(f.getvalue())

輸出:

b'\xe4\xb8\xad\xe6\x96\x87'

注意:寫入的不是str,而是經(jīng)過UTF-8編碼的bytes。

和StringIO類似,可以用一個(gè)bytes初始化BytesIO,然后,像讀文件一樣讀取:

from io import BytesIO
f = BytesIO(b'\xe4\xb8\xad\xe6\x96\x87')
d = f.read()
print(d)
print(d.decode())

輸出:

b'\xe4\xb8\xad\xe6\x96\x87'
中文

StringIO和BytesIO是在內(nèi)存中操作str和bytes的方法,使得讀寫文件具有一致的接口.

7、序列化

在程序運(yùn)行的過程中,所有的變量都是在內(nèi)存中,比如定義一個(gè)dict

dict1 = {name:"lili",age:18}

在這里我把name進(jìn)行修改,改成”leilei“,但是一旦程序結(jié)束,變量所占用的內(nèi)存就會(huì)被操作系統(tǒng)全部回收,如果沒有把修改的name存到磁盤上,下次name初始化的時(shí)候又是”lili“

在這里我們把變量從內(nèi)存中變成可存儲(chǔ)或者傳輸?shù)倪^程稱之為序列化,在python中叫picking,序列化之后,我們就可以把序列化后的內(nèi)容寫入磁盤,或是通過網(wǎng)絡(luò)傳輸?shù)絼e的機(jī)器上。反之,把變量?jī)?nèi)容從序列化的對(duì)象重新讀取到內(nèi)存里稱之為反序列化,即unpicking。

python提供了pickle模塊來實(shí)現(xiàn)序列化。

import pickle
d = dict({"name":"lili","age":18})
#pickle.dumps()方法把任意對(duì)象序列化成一個(gè)bytes,然后就可以把bytes寫入文件
print(pickle.dumps(d))
#把序列化后的對(duì)象寫入文件
f = open("t1.txt",'wb')
#參數(shù)一:要寫入的對(duì)象, 參數(shù)二:寫入文件的對(duì)象
pickle.dump(d,f)
f.close()
#從文件中讀取序列化后的對(duì)象
f2 = open("t1.txt","rb")
#pickle.load()反序列化對(duì)象
d = pickle.load(f2)
f2.close()
print(d)
print(type(d))

輸出:

{'name': 'lili', 'age': 18}
<class 'dict'>

注意:pickle只能用于python,并且不同版本的python彼此都不兼容,因此,只能用pickle保存一些不重要的數(shù)據(jù),這樣即使不能成功的反序列化也沒什么關(guān)系。

8、Json

如果我們需要在不同的編程語言之間傳遞對(duì)象,那么我們必須把對(duì)象序列化成標(biāo)準(zhǔn)化格式,比如xml,但是更好的方法是json,因?yàn)閖son表現(xiàn)出來就是一個(gè)字符串,可以被所有的語言讀取,也方便存儲(chǔ)到磁盤或者網(wǎng)絡(luò)傳輸,json不僅是標(biāo)準(zhǔn)模式,并且速度也比xml更快,還可以在web中讀取,非常方便。

JSON類型 Python類型
{} dict
[] list
“string” str
1234.56 int或float
true/false True/False
null None

把python的dict對(duì)象變成一個(gè)json

import json
dict1 = {"name":"lili","age":18}
ji = json.dumps(dict1)
print(type(ji))
with open("dd.txt","w") as f:
 json.dump(dict1,f)
with open("dd.txt","r",encoding="utf-8") as f:
 du = json.load(f)
 print(du)
 print(type(du))

輸出:

<class 'str'>
{'name': 'lili', 'age': 18}
<class 'dict'>

將一個(gè)class對(duì)象序列化為json

import json
class Student(object):
 def __init__(self, name, age, score):
  self.name = name
  self.age = age
  self.score = score
# 將student對(duì)象轉(zhuǎn)換為dict
def student2dict(std):
 return {
  'name': std.name,
  'age': std.age,
  'score': std.score
 }
s = Student('Bob', 20, 88)
# 參數(shù)一:要傳入的對(duì)象 參數(shù)二:將對(duì)象轉(zhuǎn)為dict的函數(shù)
d = json.dumps(s, default=student2dict)
# 將dict轉(zhuǎn)為對(duì)象
def dict2student(d):
 return Student(d['name'], d['age'], d['score'])
jsonStr = '{"age": 20, "score": 88, "name": "Bob"}'
# json反序列化為一個(gè)對(duì)象
# 參數(shù)一:json字符串,參數(shù)二:dict轉(zhuǎn)為對(duì)象的函數(shù)
print(json.loads(jsonStr, object_hook=dict2student))
# 寫入文件
with open("t1.txt","w") as f:
 f.write(d)
 #或者直接使用下面的語句
 #json.dump(s,f,default=student2dict)
# 讀取文件
with open("t1.txt","r",encoding="utf-8") as f:
 du = json.load(f,object_hook=dict2student)
print(du)

輸出:

<__main__.Student object at 0x000002CA795AA0F0>
<__main__.Student object at 0x000002CA7975B0F0>

9、讀寫csv文件

①、讀csv文件

csv文件本身就是個(gè)純文本文件,這種文件格式經(jīng)常用來作為不同程序之間的數(shù)據(jù)交互的格式.

演示:

需求:讀取001.scv文件

說明:可以直接打印,然后定義list

import csv
def readCsv(path):
 #列表
 infoList = []
 #以只讀的形式打開文件
 with open(path, 'r') as f:
  #讀取文件的內(nèi)容
  allFileInfo = csv.reader(f)
  #將獲取到的內(nèi)容逐行追加到列表中
  for row in allFileInfo:
   infoList.append(row)
 return infoList
path = r"C:\Users\xlg\Desktop\001.csv"
info = readCsv(path)

②、寫csv文件

演示:

需求:向002.csv文件中寫入內(nèi)容

import csv
#以寫的方式打開文件
def writeCsv(path,data):
 with open(path,'w',newline='') as f:
  writer = csv.writer(f)
  for rowData in data:
   print("rowData =", rowData)
   #按行寫入
   writer.writerow(rowData)
path = r"C:\Users\xlg\Desktop\002.csv"
writeCsv(path,[[1,2,3],[4,5,6],[7,8,9]])

10、讀取pdf文件

pip是一個(gè)安裝和管理python包的工具

在進(jìn)行代碼演示之前,首先進(jìn)行安裝和pdf相關(guān)的工具

a.在cmd中輸入以下命令: pip list [作用:列出pip下安裝的所有的工具]

b.安裝pdfminer3k,繼續(xù)輸入以下命令:pip install pdfminer3k

c.代碼演示

import sys
import importlib
importlib.reload(sys)
from pdfminer.pdfparser import PDFParser, PDFDocument
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter #解釋器
from pdfminer.converter import PDFPageAggregator #轉(zhuǎn)換器
from pdfminer.layout import LTTextBoxHorizontal, LAParams #布局
from pdfminer.pdfinterp import PDFTextExtractionNotAllowed #是否允許pdf和text轉(zhuǎn)換
def readPDF(path, toPath):
 #以二進(jìn)制形式打開pdf文件
 f = open(path, "rb")
 #創(chuàng)建一個(gè)pdf文檔分析器
 parser = PDFParser(f)
 #創(chuàng)建pdf文檔
 pdfFile = PDFDocument()
 #鏈接分析器與文檔對(duì)象
 parser.set_document(pdfFile)
 pdfFile.set_parser(parser)
 #提供初始化密碼
 pdfFile.initialize()
 #檢測(cè)文檔是否提供txt轉(zhuǎn)換
 if not pdfFile.is_extractable:
  raise PDFTextExtractionNotAllowed
 else:
  #解析數(shù)據(jù)
  #數(shù)據(jù)管理器
  manager = PDFResourceManager()
  #創(chuàng)建一個(gè)PDF設(shè)備對(duì)象
  laparams = LAParams()
  device = PDFPageAggregator(manager, laparams=laparams)
  #解釋器對(duì)象
  interpreter = PDFPageInterpreter(manager, device)
  #開始循環(huán)處理,每次處理一頁(yè)
  for page in pdfFile.get_pages():
   interpreter.process_page(page)
   layout = device.get_result()
   for x in layout:
    if (isinstance(x, LTTextBoxHorizontal)):
     with open(toPath, "a") as f:
      str = x.get_text()
      #print(str)
      f.write(str+"\n")
path = r"0319開始.pdf"
toPath = r"n.txt"
readPDF(path, toPath)

更多關(guān)于Python相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Python文件與目錄操作技巧匯總》、《Python文本文件操作技巧匯總》、《Python數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Python函數(shù)使用技巧總結(jié)》、《Python字符串操作技巧匯總》及《Python入門與進(jìn)階經(jīng)典教程

希望本文所述對(duì)大家Python程序設(shè)計(jì)有所幫助。

相關(guān)文章

  • python+excel接口自動(dòng)化獲取token并作為請(qǐng)求參數(shù)進(jìn)行傳參操作

    python+excel接口自動(dòng)化獲取token并作為請(qǐng)求參數(shù)進(jìn)行傳參操作

    這篇文章主要介紹了python+excel接口自動(dòng)化獲取token并作為請(qǐng)求參數(shù)進(jìn)行傳參操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-11-11
  • Python利用shutil模塊實(shí)現(xiàn)文件的裁剪與壓縮

    Python利用shutil模塊實(shí)現(xiàn)文件的裁剪與壓縮

    shutil可以簡(jiǎn)單地理解為sh+util ,shell工具的意思。shutil模塊是對(duì)os模塊的補(bǔ)充,主要針對(duì)文件的拷貝、刪除、移動(dòng)、壓縮和解壓操作。本文將利用這一模塊實(shí)現(xiàn)文件的裁剪、壓縮與解壓縮,需要的可以參考一下
    2022-05-05
  • python制作抽獎(jiǎng)程序代碼詳解

    python制作抽獎(jiǎng)程序代碼詳解

    在本篇內(nèi)容里小編給大家整理了一篇關(guān)于python制作抽獎(jiǎng)程序代碼詳解內(nèi)容,需要的朋友們可以參考下。
    2021-01-01
  • Python格式化字符串f-string概覽(小結(jié))

    Python格式化字符串f-string概覽(小結(jié))

    這篇文章主要介紹了Python格式化字符串f-string概覽(小結(jié)),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-06-06
  • Python實(shí)現(xiàn)識(shí)別手寫數(shù)字大綱

    Python實(shí)現(xiàn)識(shí)別手寫數(shù)字大綱

    這篇文章主要為大家詳細(xì)介紹了Python實(shí)現(xiàn)識(shí)別手寫數(shù)字的大綱,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • 運(yùn)行django項(xiàng)目指定IP和端口的方法

    運(yùn)行django項(xiàng)目指定IP和端口的方法

    今天小編就為大家分享一篇運(yùn)行django項(xiàng)目指定IP和端口的方法。具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-05-05
  • 詳解pytorch中squeeze()和unsqueeze()函數(shù)介紹

    詳解pytorch中squeeze()和unsqueeze()函數(shù)介紹

    這篇文章主要介紹了詳解pytorch中squeeze()和unsqueeze()函數(shù)介紹,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • Python3壓縮和解壓縮實(shí)現(xiàn)代碼

    Python3壓縮和解壓縮實(shí)現(xiàn)代碼

    這篇文章主要介紹了Python3壓縮和解壓縮實(shí)現(xiàn)代碼,代碼簡(jiǎn)單易懂,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-03-03
  • Python學(xué)習(xí)之字符串常用操作詳解

    Python學(xué)習(xí)之字符串常用操作詳解

    字符串是Pyhon中的常用的數(shù)據(jù)類型,這篇文章主要為大家詳細(xì)介紹一下python字符串的一些常用操作,文中示例代碼講解詳細(xì),需要的朋友可以參考下
    2022-09-09
  • Python學(xué)習(xí)之路安裝pycharm的教程詳解

    Python學(xué)習(xí)之路安裝pycharm的教程詳解

    pycharm 是一款功能強(qiáng)大的 Python 編輯器,具有跨平臺(tái)性。這篇文章主要介紹了Python學(xué)習(xí)之路安裝pycharm的教程,本文分步驟通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-06-06

最新評(píng)論