python 读写csv文件(创建、追加、覆盖)_python文件操作
大神一看題目就知道用python中的string.split('\'),記得之前處理大量的文件的時(shí)候,有時(shí)候有幾十萬(wàn)的文本文件,經(jīng)常會(huì)讀取獲取名稱,并且保存為名字一樣的另外一種格式的文件
其實(shí)python中有一句話可以解決這個(gè)問(wèn)題的方法,如下
根據(jù)全路徑獲取文件名稱的方法os.path.basename(path)
獲取文件所在路徑的方法os.path.dirname(path)
轉(zhuǎn)自:http://blog.csdn.net/linux__kernel/article/details/8271326
很多人在Google上不停的找合適自己的壓縮,殊不知Py的壓縮很不錯(cuò)。可以試試。當(dāng)然C#,Java的壓縮也有第三方的類。Py有很多美名:數(shù)學(xué)理論強(qiáng)大,數(shù)據(jù)結(jié)構(gòu)高級(jí)等等,關(guān)于壓縮算法當(dāng)然用Py更加簡(jiǎn)單易用,達(dá)到目的才是最重要的。
Python壓縮ZIP文件:
import zipfile
f = zipfile.ZipFile(target,'w',zipfile.ZIP_DEFLATED)
f.write(filename,file_url)
f.close()
其中target:是壓縮后要保存的路徑,可以是: 'C:\\temp\\'
ZIP_DEFLATED:表示壓縮,還有一個(gè)參數(shù):ZIP_STORE:表示只打包,不壓縮。這個(gè)Linux中的gz跟tar格式有點(diǎn)類似.
write方法如果只有一個(gè)參數(shù)filename的話,表示把你filename所帶的路徑全部壓縮到zip文件中。如果帶兩個(gè)參數(shù),表示把filename路徑中的那個(gè)file壓縮一下并且存放到file_url中,中間沒(méi)有增加任何的文件夾。
如果要壓縮很多的文件,循環(huán)的write就ok了
最后close掉。
Python解壓ZIP文件:
f = zipfile.ZipFile("zipfilePath",'r')
for file in f.namelist():
f.extract(file,"temp/")
zipfilePath是壓縮文件的路徑
循環(huán)訪問(wèn)該壓縮文件中的文件,并且一個(gè)一個(gè)file的解壓到對(duì)應(yīng)的"temp\"文件夾中
解壓當(dāng)前目錄下的zip文件到當(dāng)前目錄,并刪除原有的zip文件
importzipfileimportos
file_list= os.listdir(r'.')for file_name infile_list:if os.path.splitext(file_name)[1] == '.zip':printfile_name
file_zip= zipfile.ZipFile(file_name, 'r')for file infile_zip.namelist():
file_zip.extract(file, r'.')
file_zip.close()
os.remove(file_name)
View Code
這里討論使用Python解壓例如以下五種壓縮文件:
.gz .tar? .tgz .zip .rar
簡(jiǎn)單介紹
gz:?即gzip。通常僅僅能壓縮一個(gè)文件。與tar結(jié)合起來(lái)就能夠?qū)崿F(xiàn)先打包,再壓縮。
tar: linux系統(tǒng)下的打包工具。僅僅打包。不壓縮
tgz:即tar.gz。先用tar打包,然后再用gz壓縮得到的文件
zip:?不同于gzip。盡管使用相似的算法,能夠打包壓縮多個(gè)文件。只是分別壓縮文件。壓縮率低于tar。
rar:打包壓縮文件。最初用于DOS,基于window操作系統(tǒng)。
壓縮率比zip高,但速度慢。隨機(jī)訪問(wèn)的速度也慢。
關(guān)于zip于rar之間的各種比較。可見:
gz
因?yàn)間z一般僅僅壓縮一個(gè)文件,全部常與其它打包工具一起工作。比方能夠先用tar打包為XXX.tar,然后在壓縮為XXX.tar.gz
解壓gz,事實(shí)上就是讀出當(dāng)中的單一文件,Python方法例如以下:
import gzip
import os
def un_gz(file_name):
"""ungz zip file"""
f_name = file_name.replace(".gz", "")
#獲取文件的名稱,去掉
g_file = gzip.GzipFile(file_name)
#創(chuàng)建gzip對(duì)象
open(f_name, "w+").write(g_file.read())
#gzip對(duì)象用read()打開后,寫入open()建立的文件里。
g_file.close()
#關(guān)閉gzip對(duì)象
tar
XXX.tar.gz解壓后得到XXX.tar,還要進(jìn)一步解壓出來(lái)。
*注:tgz與tar.gz是同樣的格式,老版本號(hào)DOS擴(kuò)展名最多三個(gè)字符,故用tgz表示。
因?yàn)檫@里有多個(gè)文件,我們先讀取全部文件名稱。然后解壓。例如以下:
import tarfile
def un_tar(file_name):
untar zip file"""
tar = tarfile.open(file_name)
names = tar.getnames()
if os.path.isdir(file_name + "_files"):
pass
else:
os.mkdir(file_name + "_files")
#因?yàn)榻鈮汉笫呛芏辔募?#xff0c;預(yù)先建立同名目錄
for name in names:
tar.extract(name, file_name + "_files/")
tar.close()
*注:tgz文件與tar文件同樣的解壓方法。
zip
與tar類似,先讀取多個(gè)文件名稱,然后解壓。例如以下:
import zipfile
def un_zip(file_name):
"""unzip zip file"""
zip_file = zipfile.ZipFile(file_name)
if os.path.isdir(file_name + "_files"):
pass
else:
os.mkdir(file_name + "_files")
for names in zip_file.namelist():
zip_file.extract(names,file_name + "_files/")
zip_file.close()
rar
由于rar通常為window下使用,須要額外的Python包rarfile。
解壓到Python安裝文件夾的/Scripts/文件夾下,在當(dāng)前窗體打開命令行,
輸入Python?setup.py?install
安裝完畢。
import rarfile
import os
def un_rar(file_name):
"""unrar zip file"""
rar = rarfile.RarFile(file_name)
if os.path.isdir(file_name + "_files"):
pass
else:
os.mkdir(file_name + "_files")
os.chdir(file_name + "_files"):
rar.extractall()
rar.close()
tar打包
在寫打包代碼的過(guò)程中,使用tar.add()添加文件時(shí),會(huì)把文件本身的路徑也加進(jìn)去,加上arcname就能依據(jù)自己的命名規(guī)則將文件添加tar包
打包代碼:
#!/usr/bin/env?/usr/local/bin/python
#?encoding:?utf-8
import?tarfile
import?os
import?time
start?=?time.time()
tar=tarfile.open('/path/to/your.tar,'w')
for?root,dir,files?in?os.walk('/path/to/dir/'):
for?file?in?files:
fullpath=os.path.join(root,file)
tar.add(fullpath,arcname=file)
tar.close()
print?time.time()-start
在打包的過(guò)程中能夠設(shè)置壓縮規(guī)則,如想要以gz壓縮的格式打包
tar=tarfile.open('/path/to/your.tar.gz','w:gz')
其它格式例如以下表:
tarfile.open的mode有非常多種:
mode action
'r' or 'r:*'
Open for reading with transparent compression (recommended).
'r:'
Open for reading exclusively without compression.
'r:gz'
Open for reading with gzip compression.
'r:bz2'
Open for reading with bzip2 compression.
'a' or 'a:'
Open for appending with no compression.?The file is created if it does not exist.
'w' or 'w:'
Open for uncompressed writing.
'w:gz'
Open for gzip compressed writing.
'w:bz2'
Open for bzip2 compressed writing.
tar解包
tar解包也能夠依據(jù)不同壓縮格式來(lái)解壓。
#!/usr/bin/env?/usr/local/bin/python
#?encoding:?utf-8
import?tarfile
import?time
start?=?time.time()
t?=?tarfile.open("/path/to/your.tar",?"r:")
t.extractall(path?=?'/path/to/extractdir/')
t.close()
print?time.time()-start
上面的代碼是解壓全部的,也能夠挨個(gè)起做不同的處理,但要假設(shè)tar包內(nèi)文件過(guò)多,小心內(nèi)存哦~
tar?=?tarfile.open(filename,?'r:gz')
for?tar_info?in?tar:
file?=?tar.extractfile(tar_info)
do_something_with(file)
這幾天做程序作業(yè)的時(shí)候需要用python的讀取文件功能,在我用readlines()函數(shù)做逐行讀取的時(shí)候遇到了一個(gè)小問(wèn)題,在這里和大家分享一下。
txt文件里的內(nèi)容是這樣的:
1 1
2 2
3 3
4 4
5 5
代碼也沒(méi)什么問(wèn)題:
1 with open('001.txt','r') as f:
2 lines = f.readlines()
3 for line in lines:
4 print(line)
但運(yùn)行出來(lái)就。。。:
1 1
2
3 2
4
5 3
6
7 4
8
9 5
每?jī)尚兄g都出現(xiàn)了奇怪的空行,這是怎么回事呢?
其實(shí)是因?yàn)槲募忻啃心┪矔?huì)有一個(gè)隱藏的換行符“\n”,讀取之后“\n”會(huì)被解析出來(lái)形成換行,而print()語(yǔ)句本身就自帶換行的效果,兩個(gè)換行疊加之后就會(huì)出現(xiàn)空行。
那么怎樣消除這個(gè)bug呢?
其實(shí)很簡(jiǎn)單,python有兩個(gè)自帶的函數(shù):.strip()和.rstrip()
.strip()的意思是消除字符串整體的指定字符
.rstrip()的意思是消除字符串末尾的指定字符
括號(hào)里什么都不寫,默認(rèn)消除空格和換行符
ok,我們?cè)賮?lái)試試:
1 with open('001.txt','r') as f:
2 lines = f.readlines()
3 for line in lines:
4 print(line.strip())
運(yùn)行結(jié)果:
1 1
2 2
3 3
4 4
5 5
問(wèn)題解決!
刪除文件或者文件夾
import os
import shutil
name = "test"
if os.path.exists(name): #判斷文件或者文件夾是否存在
if not os.listdir(name): #判斷文件夾是否為空
os.rmdir(name) #只能刪除空文件夾
else:
shutil.rmtree(str(name)) #刪除非空文件夾
if os.path.exists(path): # 如果文件存在
# 刪除文件
os.remove(path)
問(wèn)題:UnicodeDecodeError: 'gb2312' codec can't decode bytes in position 2-3: illegal multibyte sequence
原因:python在做將普通字符串轉(zhuǎn)換為unicode對(duì)象時(shí),
例如:u_string?= unicode(string , "gb2312"),如果你的字符串string中有諸如某些繁體字,例如"河滘小學(xué)"
中的滘,那么gb2312作為簡(jiǎn)體中文編碼是不能進(jìn)行解析的,必須使用國(guó)標(biāo)擴(kuò)展碼gbk,gbk支持繁體中文和日文假文
解決方法:使用gbk,代替gb2312,例如:u_string?= unicode(string , "gbk")
總結(jié)
以上是生活随笔為你收集整理的python 读写csv文件(创建、追加、覆盖)_python文件操作的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 改变态度,改变人生
- 下一篇: 2019.9.11 小米笔试算法岗编程题