在实务上,常常有机会需要将资料写入或读出数据,而Python也提供了许多相关的模组(Module)让开发人员可以容易的进行档案的操作。透过本篇的教学,各位除了能够利用Python进行基本的档案操作外,也有能力读取及写入常见的资料交换格式档案,重点包含:
基本的档案操作JSON档案操作(JSONFiles)CSV档案操作(CSVFiles)ZIP档案操作(ZipFiles)
一、基本的档案操作
首先,先来看一下我们目前专案的档案结构,如下:
现在就来分别介绍几个Python常用的档案操作方式:
检查档案是否存在利用Path模组(Module)中的exists()方法,来检查目录下是否含有特定的档案,如下范例:
取得档案信息
利用Path模组(Module)中的stat()方法即可取得目录下特定档案的信息,如下范例:
执行结果
从执行结果可以看到包含了档案的大小st_size、修改时间st_mtime及建立时间st_ctime等。
重新命名档案利用Path模组(Module)中的rename()方法,并且传入新的档案名称及路径即可实现档案重新命名的动作,如下范例:
写入档案资料利用Path模组(Module)中的write_text()方法,并且传入要写入的资料。
读取档案资料利用Path模组(Module)中的read_text()方法,即可读取指定目录中的档案内容。
复制档案在一般的情况下,我们会利用Path模组(Module)中的read_text()方法读取原档案内容,接着,再透过write_text()方法将资料写到新档案中,来达到复制档案的目的,如下范例:
不过,有一个更简洁的方式可以达到相同的效果,就是利用shutil模组(Module)中的copy()方法,传入原档案及新档案物件,如下范例:
开启及关闭档案利用open()方法来开启档案,接着传入路径及模式,而模式分别有r(读)、w(覆写)及a(续写)三种,此方法会回传FileObject。另外,关闭档案则呼叫close()方法,如下范例:
各位可能会觉得奇怪,为什么这边读取档案内容是呼叫readline()方法而不是read_text()方法?其实,这两个方法皆可进行读取档案内容的动作,只是上面范例是利用Path物件的read_text()方法,而这边是File物件的readline()方法。
另外,使用此写法有一个缺点是,当开启档案后,在进行任何动作的过程中,如果有发生例外错误时,即有机会没有执行到关闭档案的动作,这会使得资源耗尽或导致下次执行时发生错误,所以比较好的写法是使用with陈述式(TheWithStatement),如下范例:
透过with陈述式(TheWithStatement),当区块中的档案操作结束时,Python会动呼叫close()方法来释放外部资源。
删除档案利用Path模组(Module)中的unlink()方法,即可删除目录中的档案。
二、JSON档案操作(JSONFiles)
JSON(JavaScriptObjectNotation)是一个以JavaScript语法为基础的轻量资料交换格式,由于容易产生与解析,所以现今许多网站都使用JSON来进行资料的交换。那Python要如何将应用程式中所产生的JSON格式资料写入JSON档案中呢?我们可以利用json模组(Module)中的dumps()方法将资料格式化为JSON,接着再透过Path物件的write_text()方法写入档案中,如下范例:
而要读取JSON档案中的资料,则是先利用Path物件的read_text()方法读出来,接着再透过json模组(Module)中的loads()方法将字串资料转为阵列,最后利用回圈存取各栏位的资料,如下范例:
data=Path(books.json).read_text()books=json.loads(data)#解析為陣列forbookinbooks:print(book[name])#印出所有的書名
三、CSV档案操作(CSVFiles)
CSV(Comma-SeparatedValues),也是一种资料交换的格式,与JSON不一样的地方是,每笔资料是以字元符号分隔。要透过Python将资料写入CSV档案中,需引用csv模组(Module),建立CSVwriter物件,接着透过writerow()方法写入资料,如下范例:
importcsvwithopen(books.csv,w)asfile:writer=csv.writer(file)writer.writerow([id,name,price])writer.writerow([1,Pythonforbeginner,])writer.writerow([2,Djangoforbeginner,])writer.writerow([3,Pandasforbeginner,])
另外,要读取CSV档案中的内容,则是要建立CSVreader物件,再透过回圈的方式来存取资料,如下范例:
withopen(books.csv)asfile:reader=csv.reader(file)foriteminreader:print(item)#印出所有資料
四、ZIP档案操作(ZipFiles)
还有一个常见的档案处理就是压缩,我们可以利用zipfile模组(Module)来建立ZipFile物件,接着利用回圈,将blog资料夹下的所有档案,透过write()方法加到压缩档中,如下范例:
fromzipfileimportZipFilefrompathlibimportPathwithZipFile(blog.zip,w)aszip:forfileinPath(blog).rglob(*.*):#找到blog資料夾下的所有檔案zip.write(file)#加到壓縮檔
而解压缩则是利用原压缩档来建立ZipFile物件,接着透过extractall()方法,传入目的地资料夹名称来达成,如下范例:
withZipFile(blog.zip)aszip:zip.extractall(blog_zip)#解壓縮至blog_zip資料夾当然,ZipFile物件也提供了取得压缩档内容的方法,如下范例:fromzipfileimportZipFilefrompathlibimportPathwithZipFile(blog.zip)aszip:info=zip.getinfo(blog/readme.txt)print(info.file_size)#readme.txt檔案大小print(info.