9-1 假设有两个文本文件file1.txt和file2.txt,编写程序merge.py,把两个文本文件中的内容合并到新文件result.txt中,要求文件file1.txt和file2.txt中的行在result.txt中交替出现。也就是说,result.txt文件中的奇数行来自file1.txt,而偶数行来自file2.txt。如果两个文件行数不一样,那么处理完行数较少的文件之后,把另一个文件中剩余的所有行直接追加到resul.txt的最后。
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# 获取两个文件
filename1 = input("请输入一个文件名(路径):")
filename2 = input("请输入第二个文件名(路径):")
# 将文件内容依次放入文本中
with open('result.txt', 'w') as fp:
with open(filename1) as fp1, open(filename2) as fp2:
while True:
# 将文件1的内容写入
line1 = fp1.readline()
if line1:
fp1.write(line1)
else:
flag = False
break
# 将文件2的内容写入
line2 = fp2.readline()
if line2:
fp2.write(line2)
else:
flag = True
break
# 在轮流输入后面的内容
fp3 = fp1 if flag else fp2
for line in fp3:
fp.write(fp3.readline())
9-2 编写程序,读取上一题的merge.py,在每行后加上行号并生成新文件merge_new.py,要求加上行号后的文件merge_new.p和原程序merge.py功能一样,并且所有行号对齐。
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# 打开上一题的文件
with open('merge.py') as fp:
lines = fp.readlines()
length = len(max(lines, key=len))
for index, line in enumerate(lines):
# 每一行内容最后都添加行号
# 将内容左对齐,最后的位置为行号,保证行号都在一列
lines = line.rstrip().ljust(length)+'#'+str(index)+'\n'
with open('merge_new.py', 'w') as fp:
# 将每行的内容写入新文件
fp.writelines(lines)
9-3 编写程序,统计当前文件夹中所有拓展名为ppt和pptx的Powerpoint文件的幻灯片总数量。
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import os
import os.path
# 要查找的文件夹地址
dir = "./Python程序设计与应用"
number = 0
# 遍历文件夹中的所有子文件的拓展名
for root, dirname, filenames in os.walk(dir):
for filename in filenames:
print(filename)
# 获得文件的扩展名
if os.path.splitext(filename)[1] == '.ppt' or '.pptx':
number += 1
print(number)
后来参考答案发现,这个题目是要求幻灯片的总页数不是文件数,而且参考答案很多函数还没有充分了解。以下为参考答案:
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import os
import os.path
import win32com
import win32com.client
total = 0
def pptCount(path):
global total
for subPath in os.listdir(path):
subPath = os.path.join(path, subPath)
if os.path.isdir(subPath):
pptCount(subPath)
elif subPath.endswith('.ppt'):
print(subPath)
powerpoint = win32com.client.Dispatch('PowerPoint.Application')
powerpoint.Visible = 1
ppt = powerpoint.Presentations.Open(subPath)
win32com.client.gencache.EnsureDispatch('PowerPoint.Application')
total += ppt.Slides.Count
powerpoint.Quit()
pptCount('F:\学习资料')
print(total)
9-4 编写程序,把当前目录中所有的Excel文件合并为一个文件。假设所有Excel包含同样数量的列,第一行为表头,且不存在合并单元格或其他特殊格式。
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import os
import os.path
import openpyxl
# 创建空白文件储存列表所有内容,并添加表头
Result = openpyxl.Workbook()
Result = Result.worksheets[0]
Result.append(['A', 'B'])
# 遍历当前文件夹中所有 xlsx 文件,将内容写入
passages = (passage for passage in os.listdir() if passage.endswith('.xlsx'))
for passage in passages:
wb = openpyxl.load_workbook(passage)
ws = wb.worksheets[0]
for index, row in enumerate(ws.rows):
if index == 0:
continue
Result.append(list(map(lambda cell: cell.value, row)))
# 保存文件
Result.save(Result)
9-5 编写程序,读取一个Word文件,输出其中所有表格中所有单元格的文本。
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import docx
doc = docx.Document('test.docx')
for table in doc.tables:
# 将每一行内容写入
for row in table.rows:
for cell in row.cells:
print(cell.text, end=' ')
print()
10-1 编写程序,检查D:\文件夹及其子文件夹中是否存在一个名为temp.txt的文件。
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import os
import os.path
def search(dir, filename):
# 确定路径
dirs = [dir]
while dirs:
dir1 = dirs.pop()
for path in os.listdir(dir1):
# 对每个文件夹的内容进行对比
# 若为所需文件则返回正确
if path == filename:
return True
path = os.path.join(dir1, path)
# 若为文件夹,则进一步深入
if os.path.isdir(path):
dirs.append(path)
return False
# 代码测试
a = search('D:\\', 'temp.txt')
print(a)
10-2 编写程序,查找D:\文件夹及其子文件夹中所有创建日期为2017年10月26日的文件,输出这些文件的完整路径和创建日期。
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import datetime
import os
import os.path
def search(dir, date):
# 确定路径
dirs = [dir]
while dirs:
dir1 = dirs.pop()
for path in os.listdir(dir1):
# 确定完整路径
path = os.path.join(dir1, path)
if os.path.isfile(path):
# 对比时间看是否正确
ctime = str(datetime.fromtimestamp(os.path.getctime(path)))
if ctime.startswith(date):
print(path)
print(ctime)
if os.path.isdir(path):
# 如果为文件夹则进一步深入
dirs.appand(path)
# 函数测试
search('dlls', str(datetime.date(2017, 10, 26)))
10-3 编写程序,实现文件夹增量备份。例如,第一次执行时把工作目录D:\workingDirectory及其子文件夹中的所有内容都复制到备份目录D:\backupDirectory中,并且保持目录结构一致。然后在工作目录或其任意子目录中创建一个文件夹并修改一个已有文件夹的内容,再次执行程序则会自动对比工作目录和备份目录并只复制上次备份之后修改过的文件和新建的文件。(这个题不太会,以下为参考答案)
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import os
import filecmp
import shutil
def autoBackup(scrDir, dstDir):
for item in os.listdir(scrDir):
scrItem = os.path.join(scrDir, item)
dstItem = scrItem.replace(scrDir, dstDir)
if os.path.isdir(scrItem):
if not os.path.exists(dstItem):
os.makedirs(dstItem)
print('make directory' + dstItem)
autoBackup(scrItem, dstItem)
elif os.path.isfile(scrItem):
# 只复制新增或修改过的文件
if ((not os.path.exists(dstItem))\
or (not filecmp.cmp(scrItem, dstItem, shallow=False))):
shutil.copyfile(scrItem, dstItem)
print('file:' + scrItem + '==>' + dstItem)
scrDir = r'D:\workingDirectory'
dstDir = r'D:\backupDirectory'
autoBackup(scrDir, dstDir)
10-4 改进上一个题目中的程序,要求运行后可以由用户输入工作目录和备份目录的路径。(这个题不太会,以下为参考答案)
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import os
import filecmp
import shutil
import sys
def usage():
print('scrDir和dstDir必须是某个目录的绝对路径。')
print('例如:{0} c:\\olddir c:\\newdir'.format(sys.argv[0]))
sys.exit(0)
def autoBackup(scrDir, dstDir):
if ((not os.path.isdir(scrDir)) or (not os.path.isdir(dstDir)) or
(os.path.abspath(scrDir) != scrDir) or
(os.path.abspath(dstDir) != dstDir)):
usage()
for item in os.listdir(scrDir):
scrItem = os.path.join(scrDir, item)
dstItem = scrItem.replace(scrDir, dstDir)
if os.path.isdir(scrItem):
if not os.path.exists(dstItem):
os.makedirs(dstItem)
print('make directory' + dstItem)
autoBackup(scrItem, dstItem)
elif os.path.isfile(scrItem):
# 只复制新增或修改过的文件
if ((not os.path.exists(dstItem))
or (not filecmp.cmp(scrItem, dstItem, shallow=False))):
shutil.copyfile(scrItem, dstItem)
print('file:' + scrItem + '==>' + dstItem)
if __name__ == '__main__':
if len(sys.argv) != 3:
usage()
scrDir, dstDir = sys.argv[1], sys.argv[2]
11-1 重做第9章习题1,增加异常处理结构,考虑文件不存在和无法创建文件的情况。
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# 获取两个文件
filename1 = input("请输入一个文件名(路径):")
filename2 = input("请输入第二个文件名(路径):")
# 将文件内容依次放入文本中
try:
fp = open('result.txt', 'w')
except:
print('创建文件失败。')
else:
try:
fp1 = open(filename1)
fp2 = open(filename2)
except:
print('创建文件失败。')
else:
while True:
# 将文件1的内容写入
line1 = fp1.readline()
if line1:
fp1.write(line1)
else:
flag = False
break
# 将文件2的内容写入
line2 = fp2.readline()
if line2:
fp2.write(line2)
else:
flag = True
break
# 在轮流输入后面的内容
fp3 = fp1 if flag else fp2
for line in fp3:
fp.write(fp3.readline())
11-2 重做第10章习题4,增加异常处理结构,考虑文件不存在的情况。
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import os
import filecmp
import shutil
import sys
def usage():
print('scrDir和dstDir必须是某个目录的绝对路径。')
print('例如:{0} c:\\olddir c:\\newdir'.format(sys.argv[0]))
sys.exit(0)
def autoBackup(scrDir, dstDir):
try:
if ((not os.path.isdir(scrDir)) or (not os.path.isdir(dstDir)) or
(os.path.abspath(scrDir) != scrDir) or
(os.path.abspath(dstDir) != dstDir)):
usage()
for item in os.listdir(scrDir):
scrItem = os.path.join(scrDir, item)
dstItem = scrItem.replace(scrDir, dstDir)
if os.path.isdir(scrItem):
if not os.path.exists(dstItem):
os.makedirs(dstItem)
print('make directory' + dstItem)
autoBackup(scrItem, dstItem)
elif os.path.isfile(scrItem):
# 只复制新增或修改过的文件
if ((not os.path.exists(dstItem))
or (not filecmp.cmp(scrItem, dstItem, shallow=False))):
shutil.copyfile(scrItem, dstItem)
print('file:' + scrItem + '==>' + dstItem)
except:
print('文件不存在')
if __name__ == '__main__':
if len(sys.argv) != 3:
usage()
scrDir, dstDir = sys.argv[1], sys.argv[2]
11-3 编写程序,创建一个字典,然后让用户输入一个内容作为键并输出字典中对应元素的值。如果用户输入的键不存在就进行适当的提示,如果用户输入单词quit的任意大小写(例如Quit,QUIT等)组合就结束程序。
#!/usr/bin/env python
# -*- coding:utf-8 -*-
def demo(dic):
# 编写函数用于输出键对应的值
print("你随时可以输入quit以退出循环")
while True:
# 捕获用户输入的键
key = input("请输入一个键:")
if key.lower() == 'quit':
# 用户随时可以退出循环
break
else:
# 输入正确则输出对应的值
try:
print(dic[key])
except:
print("字典中没有该键的相关信息")
# 代码测试
dic = {"姓": "陈", "名": "细利", "籍贯": "湖北省黄石市阳新县",
"兴趣": "计算机编程", "大学": "中国地质大学(武汉)"}
demo(dic)
11-4 编写程序,让用户输入两个整数start和end,然后输出这两个整数之间的一个随机数。要求考虑用户输入不是整数的情况,以及start>end的情况。根据实际情况进行适当的提示或输出。
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import random
# 获取用户输入的两个整数
try:
# 保证用户输入的是2个整数
start = int(input("请输入第一个起始整数:"))
end = int(input("请输入一个终止整数:"))
except:
print("输入的不是整数")
else:
# 确保起始数大于终止数
if start > end:
print("起始整数应该小于等于终止整数。")
else:
print(random.randint(start, end))