您的位置:首页 > 编程语言 > Python开发

Python学习笔记(五)——读写文件

2018-02-05 17:53 573 查看

文件与文件路径

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)
全部打混
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: