1.1.6练习
1、如果已有的文件以写模式打开,会发生什么?
写模式会删空文件,从头开始重新写入文件。
2、read()和readlines()方法之间的区别是什么?
read()函数直接读取txt文件的所有内容,其中换行以换行符\n表示。readlines()按行读取,并按照列表格式保存所有行。
综合练习: 一、生成随机的测验试卷文件 假如你是一位地理老师, 班上有 35 名学生, 你希望进行美国各州首府的一个 小测验。不妙的是,班里有几个坏蛋, 你无法确信学生不会作弊。你希望随机调整 问题的次序, 这样每份试卷都是独一无二的, 这让任何人都不能从其他人那里抄袭答案。当然,手工完成这件事又费时又无聊。 好在, 你懂一些 Python。
下面是程序所做的事:
• 创建 35 份不同的测验试卷。
• 为每份试卷创建 50 个多重选择题,次序随机。
• 为每个问题提供一个正确答案和 3 个随机的错误答案,次序随机。
• 将测验试卷写到 35 个文本文件中。
• 将答案写到 35 个文本文件中。
这意味着代码需要做下面的事:
• 将州和它们的首府保存在一个字典中。
• 针对测验文本文件和答案文本文件,调用 open()、 write()和 close()。
• 利用 random.shuffle()随机调整问题和多重选项的次序。
n = 60 # 60道题目
import random
QuestionsIndex = [i for i in range(60)]
content = dict()
#os.makedirs(os.path.join(os.getcwd(),"Questions")) # 创建题目所需的文件夹
FilesPath = os.path.join(os.getcwd(),"Questions")
for i in range(60):
content[i] = [i,random.random(),random.random(),random.random()]
PeopleNum = 35 # 学生人数
for j in range(PeopleNum):
file = open(os.path.join(FilesPath,str(j)+'.txt'),'a')
TempIndex = QuestionsIndex
random.shuffle(TempIndex)
for index in TempIndex:
file.write(str(index)+"\n")
TempContent = content[index]
random.shuffle(TempContent) # 打乱答案
AnswerLine = ""
for choose in TempContent:
AnswerLine = AnswerLine + str(choose)+" "
file.write(AnswerLine+"\n")
1.2.4练习
1、编写一个程序,遍历一个目录树,查找特定扩展名的文件(诸如.pdf 或.jpg)。不论这些文件的位置在哪里, 将它们拷贝到一个新的文件夹中。
import os
import shutil
path = ''
path_copy = '' # 新的文件夹
for folderName, subFolders,fileNames in os.walk(path):
#print('The current folder is ' + folderName)
#for subFolder in subFolders:
# print('Subfolder of ' + folderName+':'+subFolder)
for filename in fileNames:
if filename.split(".")[1] == 'jpg':
shutil.copy(os.path.join(folderName,filename),path_copy)
#print('')
2、一些不需要的、 巨大的文件或文件夹占据了硬盘的空间, 这并不少见。如果你试图释放计算机上的空间, 那么删除不想要的巨大文件效果最好。但首先你必须找到它们。编写一个程序, 遍历一个目录树, 查找特别大的文件或文件夹, 比方说, 超过100MB 的文件(回忆一下,要获得文件的大小,可以使用 os 模块的 os.path.getsize())。将这些文件的绝对路径打印到屏幕上。
import os
import shutil
import send2trash
path = ''
for folderName, subFolders,fileNames in os.walk(path):
for subFolder in subFolders:
foldersize = os.path.getsize(os.path.join(folderName,subFolder))
if foldersize >10000000:
print(os.path.join(folderName,subFolder))
send2trash.send2trash(os.path.join(folderName,subFolder))
for filename in fileNames:
filesize = os.path.getsize(os.path.join(folderName,filename))
if filesize >10000000:
print(os.path.join(folderName,filename))
send2trash.send2trash(os.path.join(folderName,filename))
3、编写一个程序, 在一个文件夹中, 找到所有带指定前缀的文件, 诸如 spam001.txt,spam002.txt 等,并定位缺失的编号(例如存在 spam001.txt 和 spam003.txt, 但不存在 spam002.txt)。让该程序对所有后面的文件改名, 消除缺失的编号。作为附加的挑战,编写另一个程序,在一些连续编号的文件中,空出一些编号,以便加入新的文件。
# 创建需要的txt文件
DigitList = [1,3,4,6,7]
os.chdir('') # 改变当前工作路径
for i in DigitList:
open(os.path.join(os.getcwd(),str(i)+'.txt'),'a')
PreFile = list()
for filename in os.listdir():
if filename.endswith('.txt'):
x = filename.split(".")[0]
PreFile.append(int(x))
PreFile.sort()
for i in range(len(PreFile)):
shutil.move(os.path.join(os.getcwd(),str(PreFile[i])+'.txt'),os.path.join(os.getcwd(),str(i+1)+'.txt'))