python进阶宝典7-文件处理

import os
os.path.join('usr','bin','spam')
#目录拼接并输出。不同系统上输出不同,取决于文件系统表示。windows上为'usr\\bin\\spam', linux上为'/usr/bin/spam'

## 目录与文件路径
myfiles = ['acc.txt','bbb.csv','cedg.docx']
for filename in myfiles:
    print(os.path.join('C:\\users\\aswttt',filename))

os.chdir('C:\\Windows\\System32')     # 更改当前目录
os.getcwd()                           # 显示当前目录
os.makedirs('d:\\test\\l1\\l2')       # 创建目录
os.path.abspath('.')                  # 相对路径转绝对路径
os.path.isabs('.')                    # 判断是否绝对路径
os.path.relpath('c:\\windows','c:\\test\\l1')    #返回从参数2路径到参数1路径转换的相对路径字符串 '..\\..\\windows'

lpath = 'c:\\windows\\system32\\calc.exe'
os.path.basename(lpath)                # 文件名
os.path.dirname(lpath)                 # 目录名
os.path.split(lpath)                   # 返回包含目录名和文件名两个字符串的元组
lpath.split(os.path.sep)               # 返回一个对路径进行分割的字符串的列表
os.path.exists(lpath)                  # 目录或文件是否存在
os.path.isfile(lpath)                  # 判断文件有效性
os.path.isdir(os.path.dirname(lpath))  # 判断目录有效性

os.path.getsize(lpath)                 # 返回文件的字节数大小 
os.listdir('c:\\temp')                 # list目录中的子目录和文件名
totalSize = 0
for filename in os.listdir('c:\\temp'):
    totalSize += os.path.getsize(os.path.join('c:\\temp',filename))
print(totalSize)

## 文件读写
#1)调用open()函数,返回一个File对象
#2)调用File对象的read()或write()方法
#3)调用File对象的close()方法,关闭该文件

fpath = 'c:\\temp\\1.txt'
rfile = open(fpath)                    # 打开文件,默认为只读r 
rtxt = rfile.read()                    # 读取文件内容,赋给一个字符串
print(rtxt)
rlines = rfile.readlines()             # 读取文件内容,赋给一个字符串列表,每个字符串是文本中的每行
print(rlines)

wfile = open('c:\\temp\\2.txt','w')    # 写模式打开文件,直接清空文件后覆写
wfile.write('Hello world!\n')
wfile.close()
wfile = open('c:\\temp\\2.txt','a')    # 追加模式打开
wfile.write('Append mode open')
wfile.close()
wfile = open('c:\\temp\\2.txt','r')
content = wfile.read()
wfile.close()
print(content)

## 用shelve模块保存变量,生成到二进制的shelf文件
import shelve
shelfFile = shelve.open('mydata')      # 生成mydata.dat文件
cats = ['zophis','pooka','simon']
bats = ['test','AA']
shelfFile['cats'] = cats               # 生成mydata.dir文件
shelfFile['bats'] = bats
shelfFile.close()                      # 生产mydata.bak文件

shelfFile = shelve.open('mydata')      # 打开shelf文件使用保存的变量
type(shelfFile)                        # 显示数据类别 
print(shelfFile['cats'])               # 返回一个key的值
print(dict(shelfFile))                 # 文件内容转换成字典返回
list(shelfFile.keys())                 # 显示保存在shelf文件中所有变量的keys
list(shelfFile.values())               # 显示保存在shelf文件中所有变量的values
shelfFile.close()

## 使用 pprint.pformat()保存变量到py文件 并载入使用 
import pprint
cats = [{'name':'Sosdf','desc':'chubby'},{'name':'Poka','desc':'fluffy'}]
pprint.pformat(cats)
fileobj = open('myppdata.py','w')
fileobj.write('cats = '+pprint.pformat(cats)+'\n')
fileobj.close()

import myppdata                        # 装载之前保存变量的py文件 
myppdata.cats
myppdata.cats[0]
myppdata.cats[0]['name']

## shutil与文件复制删除
import shutil,os
shutil.copy('c:\\temp\\1.txt','c:\\temp\\test')
shutil.copy('c:\\temp\\1.txt','c:\\temp\\test\\n1.txt')
shutil.copytree('c:\\temp\\test\\intest','c:\\temp\\test\\intest2')
shutil.move('c:\\temp\\1.txt','c:\\temp\\test\\intest2')   # 移动文件到目的文件夹(不存在时移动成一个新文件)
## 上条move及以下三条均为危险命令,要格外当心
os.unlink('d:\\t_path\\1.txt')         # 彻底删除文件
os.rmdir('d:\\t_path')                 # 彻底删除空目录
#shutil.rmtree('d:\\t_path')           # 彻底删除目录及其所有内容

for filename in os.listdir():
    if filename.endswith('.rxt'):
        #os.unlink(filename)
        print(filename)

## 使用 send2trash 模块进行安全删除 - 放到回收站
import send2trash
send2trash.send2trash('c:\\temp\\test\\n1.txt')
send2trash.send2trash('c:\\temp\\test\\intest2')

## 遍历目录树 os.walk()
# os.walk()在循环的每次迭代中,返回3个值 - 当前文件夹名称串、当前文件夹中子文件夹的字符串列表、当前文件夹中文件的字符串列表
#      这里的当前文件夹时指walk()循环当前迭代的文件夹,程序本身的工作目录不会因walk而改变
#      可以使用自定义的代码,来替代以下代码中的print函数调用
import os
for folderName,subfolders,filenames in os.walk('c:\\temp\\test'):
    print('The current folder is ' + folderName)
    for subfolder in subfolders:
        print('SUBFOLDER OF ' + folderName + ': ' + subfolder )
    for filename in filenames:
        print('FILE INSIDE ' + folderName + ': ' + filename )
    print('')
print('')

## zipfile模块处理压缩文件
import zipfile,os
currentpwd = os.getcwd()
os.chdir('C:\\temp\\test')
exampleZip = zipfile.ZipFile('example.zip','a')  # 以追加模式打开压缩文件
exampleZip = zipfile.ZipFile('example.zip','w')  # 以覆盖写入模式创建压缩文件
exampleZip.write('1.txt',compress_type=zipfile.ZIP_DEFLATED)  # 添加文件到压缩文件
exampleZip.close()
exampleZip = zipfile.ZipFile('example.zip')      # 默认以只读方式打开压缩文件,不存在则报错
spamInfo = exampleZip.getinfo('1.txt')           # 获取文件信息
spamInfo.file_size                               # 显示文件大小
spamInfo.compress_size                           # 显示压缩后文件大小
'Compressed range is %s x !' % round(spamInfo.file_size / spamInfo.compress_size ,2)     #压缩倍数
exampleZip.extract('1.txt')                      # 解压缩文件到当前目录 
exampleZip.extract('1.txt','ext_dir')            # 解压缩文件到指定文件夹,如不存在则创建
exampleZip.extractall()                          # 解压缩全部文件
exampleZip.extractall('c:\\temp\\test\\2')       # 解压缩全部文件到指定文件夹,如不存在则创建
exampleZip.close()
os.chdir(currentpwd)


############################################################################
##########    例子1: 生成随机的测试试卷文件     
###
#1)创建35份不同的测试试卷
#2)为每份试卷创建50个单选题,次序随机   random.shuffle()
#3)为每个问题提供一个正确答案和3个随机的错误答案,次序随机   random.sample()
#4)讲测试试卷及答案分别写到35个文本文件中

#step 1:将测试数据保存在一个字典中
import random
# The quiz data. Keys are states and values are their capitals.
capitals = {'Alabama':'Montgomery','Alaska':'Juneau','Arzona':'Phoenix','Arkansas':'Little Rock','Wyoming':'Cheyenne',
    'California':'Sacramento','Colorado':'Denver','Connecticur':'Hartford','Delaware':'Dover','Florida':'Tallahassee',
    'Georgia':'Atlanta','Hawaii':'Honolulu','Idaho':'Boise','Illinois':'Springfield','Indiana':'Indianapolis',
    'Iowa':'Des Moines','Kansas':'Topeka','Kentucky':'Frankfort','Louisiana':'Baton Rouge','Maine':'Augusta',
    'Maryland':'Annapolis','Massachusetts':'Boston','Michigan':'Lansing','Minnesota':'Saint Paul','Mississippi':'Jackson',
    'Missouri':'Jefferson City','Montana':'Helena','Nebraska':'Lincoln','Nevada':'Carson City','New Hampshire':'Concord',
    'New Jersey':'Trenton','New Mexico':'Santa Fe','New York':'Albany','North Carolina':'Raleigh','North Dakota':'Bismarck',
    'Ohio':'Columbus','Oklahoma':'Oklahoma City','Oregon':'Salem','Pennsylvania':'Harrisburg','Rhode Island':'Providence',
    'South Carolina':'Columbia','South Dakota':'Pierre','Tennessee':'Nashville','Texas':'Austin','Utah':'Salt Lake City',
    'Vermont':'Montpelier','Virginia':'Richmond','Washington':'Olympia','West Virginia':'Charleston','Wisconsin':'Madison'
    }
#step 2:创建测验文件,并打乱问题的次序
# Generate 35 quiz files
testNums = 35
for quizNum in range(testNums):
    # Create the quiz and answer key files.
    quizFile = open('c:\\temp\\test\\capitalsquiz%s.txt' % (quizNum + 1),'w')
    answerKeyFile = open('c:\\temp\\test\\capitalsquiz_answers%s.txt' % (quizNum + 1),'w')
    # Write out the head for the quiz
    quizFile.write('Name:\n\nDate:\n\nPeriod:\n\n')
    quizFile.write((' ' * 20) + 'State capitals quizNum (Form %s)' % (quizNum + 1))
    quizFile.write('\n\n')
    # Shuffle the order of the states
    states = list(capitals.keys())
    random.shuffle(states)
#step 3:创建答案选项
    # Loop through all 50 states, making a question for each
    qNums = 50
    for questionNum in range(qNums):
        # Get right and wrong answers. 
        correctAnswer = capitals[states[questionNum]]          #从capitals中按序号取正确答案
        wrongAnswers = list(capitals.values())                 #列出所有值
        del wrongAnswers[wrongAnswers.index(correctAnswer)]    #删除正确答案
        wrongAnswers = random.sample(wrongAnswers,3)           #错误答案列表中随机取3个
        answerOptions = wrongAnswers + [correctAnswer]         #错误答案3个与正确答案组合,注意这里correctAnswer先转列表再拼接
        random.shuffle(answerOptions)                          #进行答案组合随机排序
#step 4:将内容写入测试试卷和答案文件
        # Write the question and the answer options to the quiz file. 
        quizFile.write('%s. What is the capital of %s?\n' % (questionNum + 1,states[questionNum]))
        for i in range(4):
            quizFile.write('   %s. %s\n' % ('ABCD'[i],answerOptions[i]))
        quizFile.write('\n')
        # Write the answer key to a file. 
        answerKeyFile.write('%s. %s\n' % (questionNum + 1,'ABCD'[answerOptions.index(correctAnswer)]))
        quizFile.close()
        answerKeyFile.close()        


############################################################################
##########    例子2: 批量文件改名     
###  将当前工作目录中的所有文件名中的MM-DD-YYYY 改为 DD-MM-YYYY
#
# Renames filenames with American date format to European  
import shutil,os,re 
# Create a regex that matches files with the American date format.
datePattern = re.compile(r'''^(.*?)   # all text before the date          (1)
     ((0|1)?\d)-                      # one or two digits for the month   (2(3))-
     ((0|1|2|3)?\d)-                  # one or two digits for the day     (4(5))-
     ((19|20)\d\d)                    # four digits for the year          (6(7))
     (.*?)$                           # all text after the date           (8)
     ''',re.VERBOSE)

# Loop over the files in the working directory.
for amerFilename in os.listdir('.'):
    mo = datePattern.search(amerFilename)
    # Skip files without a date.
    if mo == None:
        continue
    # Get the different parts of the filename.
    beforePart = mo.group(1)
    monthPart = mo.group(2)
    dayPart = mo.group(4)
    yearPart = mo.group(6)
    afterPart = mo.group(8)
    # Form the European-style filename.
    euroFilename = beforePart + dayPart + '-' + monthPart + '-' + yearPart + afterPart
    # Get the full,absolute file paths. 
    absWorkingDir = os.path.abspath('.')
    amerFilename = os.path.join(absWorkingDir,amerFilename)
    euroFilename = os.path.join(absWorkingDir,euroFilename)
    # Rename the files.
    print('Renaming %s to %s ...' % (amerFilename,euroFilename))
    #shutil.move(amerFilename,euroFilename)        # uncomment after testing


############################################################################
##########    例子3: 将一个文件夹备份到一个zip文件, 带版本 
###  
# Copies an entire folder and its contents into a zip file whose filename increments

import zipfile,os
def backupToZip(folder):
    # Backup the entire contents of folder into a ZIP file
    folder = os.path.abspath(folder)       # make sure folder is absolute
    # Figure out the filename this code should use based on what files already exist.
    number = 1
    while True:
        zipFilename = os.path.basename(folder) + '_' + str(number) + '.zip'
        if not os.path.exists(zipFilename):
            break
        number = number + 1
    # Create the ZIP file.
    print('Creating %s...' % (zipFilename))
    backupZip = zipfile.ZipFile(zipFilename,'w')
    # Walk the entire folder tree and compress the files in each folder
    for folderName,subfolders,filenames in os.walk(folder):
        print('Adding files in %s...' % (folderName))
        # Add the current folder to the ZIP file.
        backupZip.write(folderName)
        for filename in filenames:
            newBase = os.path.basename(folder) + '_'
            if filename.startswith(newBase) and filename.endswith('.zip'):
                continue     # don't backup the backup ZIP files
            backupZip.write(os.path.join(folderName,filename))
    backupZip.close()
    print('Done.')

backupToZip('C:\\temp\\test')    

你可能感兴趣的:(python)