文件与文件路径
window上的 ‘\’ 和 Linux与OS X 上的 ‘/’
window上的路径为:C:/Python/Python37/phoneAndEmail.py
OS X 和 Linux上的路径为: usr/bin/spam
所以如果要使你的Python程序在各种系统上通用,在涉及文件目录的情况下可以使用os.path.join()
,这个函数会自动根据系统进行匹配
>>> import os
>>> os.path.join('python','python37')
'python\\python37'
>>> myFile = ['acounts.txt','details.csv','invite.docx']
>>> for filename in myFile
SyntaxError: invalid syntax
>>> for filename in myFile:
print(os.path.join('C:\\Users\\asweigart',filename))
#在print的输出下,显示为
C:\Users\asweigart\acounts.txt
C:\Users\asweigart\details.csv
C:\Users\asweigart\invite.docx
>>> for filename in myFile:
os.path.join('C:\\Users\\asweigart',filename)
#实际存储的字符串(这是由于转义字符的原因)
'C:\\Users\\asweigart\\acounts.txt'
'C:\\Users\\asweigart\\details.csv'
'C:\\Users\\asweigart\\invite.docx'
当前工作的目录
os.getcwd()
查询现在工作文件夹
os.chdir('xxx')
转到某个文件夹
>>> os.getcwd()
'C:\\Programs\\Python\\Python37'
>>> os.chdir('D:')
>>> os.getcwd()
'D:\\'
使用os.makedirs()
创建文件夹
>>> os.makedirs('D://123456')
处理绝对路径和相对路径
os.path.abspath('.')
返回当前绝对路径
os.path.abspath('.\\123456')
返回所选文文件的绝对路径
>>> os.path.abspath('.')
'D:\\'
>>> os.path.abspath('.\\123456')
'D:\\123456'
>>> os.path.isabs('.')
False
>>> os.path.isabs(os.path.abspath('.'))
True
os.path.relpath(path,start)
从start
到 path
的相对路径
>>> os.path.relpath('C:\\windows','C:\\spam\\eggs')
'..\\..\\windows'
>>> os.path.relpath('C:\\windows','C:\\')
'windows'
>>> path = os.path.join(os.getcwd(),'Text.txt')
>>> path
'D:\\python\\Text.txt'
>>> os.path.basename(path)
'Text.txt'
>>> os.path.dirname(path)
'D:\\python'
>>> os.path.split(path)
('D:\\python', 'Text.txt')
>>> os.path.sep
'\\'
>>> path.split(os.path.sep)
['D:', 'python', 'Text.txt']
查看文集大小和文件内容
os.path.getsize()
文件,或者文件夹大小
os.listdir()
文件夹下的项目
>>> os.path.getsize(path)
4096
#返回的单位是字节
>>> print('\n'.join(os.listdir(path)))
def.py
for.py
random.py
try.py
全局变量.py
字典题.py
引用调用.py
>>> for k in os.listdir(path):
print(k + '\t' +str(os.path.getsize(os.path.join(path,k))))
def.py 149
for.py 466
random.py 68
try.py 405
全局变量.py 89
字典题.py 472
引用调用.py 84
检查路径的有效性
os.path.exists()
文件或者文件夹是否存在os.path.isdir()
是否是文件夹os.path.isfile()
是否是个文件
>>> path
'D:\\python'
>>> os.path.exists(path)
True
>>> os.path.isdir(path)
True
>>> os.path.isfile(path)
False
文件的读写过程
用open()函数打开文件
>>> path
'D:\\python\\def.py'
>>> openFile = open(path)
>>> openFile
<_io.TextIOWrapper name='D:\\python\\def.py' mode='r' encoding='cp936'>
读取文件内容
>>> openContent = openFile.read()
>>> print(openContent)
def hello(k):
print(str(k)+'\n')
k = k + 1
return k
k = 0;
k = hello(k)
k = hello(k)
for i in range(10):
k = hello(k)
#返回的是字符串
>>> openFile.readlines()
['def hello(k):\n', " print(str(k)+'\\n')\n", ' k = k + 1\n', ' return k\n', ' \n', 'k = 0;\n', 'k = hello(k)\n', 'k = hello(k)\n', 'for i in range(10):\n', ' k = hello(k)\n']
#返回的是列表
写文件
>>> wFile = open(path,'w') #创建文件
>>> wFile.write('Hello World!\n') #在文件中写内容
13
>>> wFile.close()
open(path,'a')
以追加的方式写入
>>> wFile = open(path,'a')
>>> wFile.write('from' + path)
22
>>> wFile.close()
用shelve模块保存变量
>>> shelfFile = shelve.open('mydata')
>>> cats = ['Zophie','Pooka','Simon']
>>> shelfFile['cats'] = cats
>>> shelfFile.close()
会产生三个文件
>>> sFile = shelve.open('mydata')
>>> print(sFile['cats'])
['Zophie', 'Pooka', 'Simon']
>>> sFile['cats'][1] = 'Temp'
>>> print(sFile['cats'])
['Zophie', 'Pooka', 'Simon']
>>> shelfFile.close()
怎么会无法修改?
其实很简单,Temp
没有写回,你把['Zophie', 'Pooka', 'Simon']
存到了cats
,当你再次读取sFile['cats']
的时候,sFile['cats']
只是一个拷贝,而你没有将拷贝写回,所以当你再次读取sFile['cats']
的时候,它又从源中读取了一个拷贝,所以,你新修改的内容并不会出现在拷贝中,解决的办法就是,第一个是利用一个缓存的变量
>>> sFile = shelve.open('mydata')
>>> temp = sFile['cats']
>>> temp
['Zophie', 'Pooka', 'Simon']
>>> temp[1] = 123
>>> sFile['cats'] = temp
>>> sFile['cats']
['Zophie', 123, 'Simon']
>>> sFile.close()
用法和字典类似
>>> sFile = shelve.open('mydata')
>>> list(sFile.keys())
['cats']
>>> list(sFile.values())
[['Zophie', 123, 'Simon']]
>>> list(sFile.items())
[('cats', ['Zophie', 123, 'Simon'])]
>>> sFile.close()
使用pprint.pformat()函数保存变量
>>> import pprint
>>> cats = [{'name':'Zophie','desc':'chubby'},{'name':'Pooka','desc':'fluffy'}]
>>> pprint.pformat(cats)
"[{'desc': 'chubby', 'name': 'Zophie'}, {'desc': 'fluffy', 'name': 'Pooka'}]"
>>> fileObg = open('myCats.py','w')
>>> fileObg.write('cats = ' + pprint.pformat(cats)+'\n')
83
>>> fileObg.close()
>>> import myCats
>>> myCats.cats
[{'desc': 'chubby', 'name': 'Zophie'}, {'desc': 'fluffy', 'name': 'Pooka'}]
>>> myCats.cats[0]
{'desc': 'chubby', 'name': 'Zophie'}
>>> myCats.cats[0]['name']
'Zophie'
小实验——生成随机的测验试卷文件
#! python3
import random
capitals = {'山西':'太原',
'河北':'石家庄',
'辽宁':'沈阳',
'吉林':'长春',
'黑龙江':'哈尔滨',
'江苏':'南京',
'安徽':'合肥',
'山东':'济南',
'浙江':'杭州',
'江西':'南昌',
'福建':'福州',
'湖南':'长沙',
'湖北':'武汉',
'河南':'郑州',
'广东':'广州',
'广西壮族自治区':'南宁',
'海南':'海口',
'贵州':'贵阳',
'云南':'昆明',
'四川':'成都',
'陕西':'西安',
'甘肃':'兰州',
'宁夏回族自治区':'银川',
'青海':'西宁',
'新疆维吾尔自治区':'乌鲁木齐',
'西藏自治区':'拉萨',
'台湾省':'台北',
'北京':'北京',
'上海':'上海',
'天津':'天津',
'重庆':'重庆',
'香港':'香港',
'澳门':'澳门'}
#随机出5份试卷
for quizNum in range(5):
#创建文件
quizFile = open('试卷%s.txt'%(quizNum+1),'w')
answerFile = open('答案%s.txt'%(quizNum+1),'w')
#文件表头
quizFile.write('Name:\nData:\nPeriod:\n\n')
quizFile.write((' '*20)+'试卷%s'%(quizNum+1))
quizFile.write('\n\n')
answerFile.write((' '*20)+'试卷%s'%(quizNum+1))
answerFile.write('\n\n')
#生成试题
states = list(capitals.keys())
random.shuffle(states)
#创建选择答案选项
for questionNum in range(33):
Answer = capitals[states[questionNum]]
wrongAnswer = list(capitals.values())
del wrongAnswer[wrongAnswer.index(Answer)]
wrongAnswer = random.sample(wrongAnswer,3)
answerOption = wrongAnswer + [Answer]
random.shuffle(answerOption)
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],answerOption[i]))
quizFile.write('\n')
answerFile.write(' %s.%s\t'%(questionNum+1,'ABCD'[answerOption.index(Answer)]))
if((questionNum+1) % 5 == 0):
answerFile.write('\n')
quizFile.close()
answerFile.close()
print('试卷'+str(quizNum+1)+'生成')
小实验——多重剪贴板
#! python3
# mcb.py - Save and loads pieces of text to the clipboard
# Usage: mcb.pyw save <key> - Save clipboard to keyworld
# mcb.pyw <key> - Loads keyworld to clipboard
# mcb.pyw list - Loads all keyworld to clipboard
# mcb.pyw del <key> - del keyworld
# mec.pyw del - del all key world
#Author : qmeng
#MailTo : qmeng1128@163.com
#QQ : 1163306125
#Blog : http://blog.csdn.net/Mq_Go/
#Create : 2018-02-06
#Version: 1.0
import sys,pyperclip,shelve
mcbShelf = shelve.open('mcb')
# TODO:Save and del clipboard content.
if len(sys.argv) == 3:
if sys.argv[1].lower() == 'save':
mcbShelf[sys.argv[2]] = pyperclip.paste()
elif sys.argv[1].lower() == 'del':
if sys.argv[2] in mcbShelf.keys():
del mcbShelf[sys.argv[2]]
print(sys.argv[2] + '删除成功')
else:
print('没有'+sys.argv[2]+'项')
# TODO:List keywords and load cintent or del all keyworlds.
if len(sys.argv) == 2:
if sys.argv[1].lower() == 'list':
pyperclip.copy(str(list(mcbShelf.keys())))
elif sys.argv[1].lower() == 'del':
if mcbShelf is not None:
for item in mcbShelf.items():
print('删除数据[{}] = [{}]'.format(item[0], mcbShelf[item[0]]))
del mcbShelf[item[0]]
else:
print('mcb 为空!')
else:
if sys.argv[1].lower() in mcbShelf.keys():
pyperclip.copy(mcbShelf[sys.argv[1]])
else:
print('Sorry,未找到该项')
mcbShelf.close()
注:
汉字匹配:[\u4E00-\u9FA5]
.pyw格式不会显示终端窗口
random.sample(wrongAnswer,3)
随机取样
random.shuffle(states)
全部打混