DataWhale7月学习——Python入门

Task9:文件与文件系统

本节我们初步学习Python语法中的文件与文件系统。文章给出了一些重点知识的.py程序便于读者深入理解。本文的程序编写基于Python3.0+,安装环境使用的是PyCharm。

文件与文件系统

打开文件

open(file, mode='r', buffering=None, encoding=None, errors=None, newline=None, closefd=True)

file:文件相对(或绝对)路径(必需)
mode:文件打开方式(可选),包括’r’(只读)、‘w’(写入)、'b’二进制模式打开文件(一般用于非文本文件,如图片)、't’以文本模式打开(一般用于文本文件)
buffering:设置缓冲
encoding:一般使用utf8
errors:报错级别
newline:区分换行符
例:打开一个文件并返回文件对象,如果该文件无法被打开,会抛出0SError

f = open('将进酒.txt')
print(f)
# <_io.TextIOWrapper name='将进酒.txt' mode='r' encoding='cp936'>
for each in f:
 print(each)
# 君不⻅,⻩河之⽔天上来,奔流到海不复回。
# 君不⻅,⾼堂明镜悲⽩发,朝如⻘丝暮成雪。
# ⼈⽣得意须尽欢,莫使⾦樽空对⽉。
# 天⽣我材必有⽤,千⾦散尽还复来。
# 烹⽺宰⽜且为乐,会须⼀饮三百杯。
# 岑夫⼦,丹丘⽣,将进酒,杯莫停。
# 与君歌⼀曲,请君为我倾⽿听。
# 钟⿎馔⽟不⾜贵,但愿⻓醉不复醒。
# 古来圣贤皆寂寞,惟有饮者留其名。
# 陈王昔时宴平乐,⽃酒⼗千恣欢谑。
# 主⼈何为⾔少钱,径须沽取对君酌。
# 五花⻢,千⾦裘,呼⼉将出换美酒,与尔同销万古愁。

文件对象方法

1.fileObject.close()用于关闭一个已打开的文件。关闭后的文件不能再进行读写操作,否则会触发ValueError错误

f = open("将进酒.txt")
print('FileName:', f.name) # FileName: 将进酒.txt
f.close()

2.fileObject.read([size])用于从文件中读取制定的字符数,如果为给定或为负则读取所有

f = open('将进酒.txt', 'r')
line = f.read(20)
print("读取的字符串: %s" % line)
# 读取的字符串: 君不⻅,⻩河之⽔天上来,奔流到海不复回。
f.close()

3.fileObject.readline()读取整行,包括"\n"字符

f = open('将进酒.txt', 'r')
line = f.readline()
print("读取的字符串: %s" % line)
# 读取的字符串: 君不⻅,⻩河之⽔天上来,奔流到海不复回。
f.close()

4.fileObject.readlines()用于读取所有行并返回列表,该列表可以由Python的for… in
…进行处理

f = open('将进酒.txt', 'r')
lines = f.readlines()
print(lines)
for each in lines:
 each.strip()
 print(each)
# 君不⻅,⻩河之⽔天上来,奔流到海不复回。
# 君不⻅,⾼堂明镜悲⽩发,朝如⻘丝暮成雪。
# ⼈⽣得意须尽欢,莫使⾦樽空对⽉。
# 天⽣我材必有⽤,千⾦散尽还复来。
# 烹⽺宰⽜且为乐,会须⼀饮三百杯。
# 岑夫⼦,丹丘⽣,将进酒,杯莫停。
# 与君歌⼀曲,请君为我倾⽿听。
# 钟⿎馔⽟不⾜贵,但愿⻓醉不复醒。
# 古来圣贤皆寂寞,惟有饮者留其名。
# 陈王昔时宴平乐,⽃酒⼗千恣欢谑。
# 主⼈何为⾔少钱,径须沽取对君酌。
# 五花⻢,千⾦裘,呼⼉将出换美酒,与尔同销万古愁。
f.close()

5.fileObject.tell():返回文件指针当前位置

f = open('将进酒.txt', 'r')
line = f.readline()
print(line)
# 君不⻅,⻩河之⽔天上来,奔流到海不复回。
pos = f.tell()
print(pos) # 42
f.close()

6.fileObject.seek(offset[, whence]):用于移动文件读取指针到指定位置
offset:开始的偏移量,即需要移动偏移的字节数。给offset定义一个参数表示从哪个位置开始偏移
whence:(可选)默认值为0,0表示从文件头开始算起,1表示从当前位置算起,2表示从文件末尾算起

f = open('将进酒.txt', 'r')
line = f.readline()
print(line)
# 君不⻅,⻩河之⽔天上来,奔流到海不复回。
line = f.readline()
print(line)
# 君不⻅,⾼堂明镜悲⽩发,朝如⻘丝暮成雪。
f.seek(0, 0)
line = f.readline()
print(line)
# 君不⻅,⻩河之⽔天上来,奔流到海不复回。
f.close()

7.fileObject.write(str):用于向文件中写入指定字符串,返回的是写入的字符长度

f = open('workfile.txt', 'wb+')
print(f.write(b'0123456789abcdef')) # 16
print(f.seek(5)) # 5
print(f.read(1)) # b'5'
print(f.seek(-3, 2)) # 13
print(f.read(1)) # b'd'

如果文件打开模式带b,那写入文件内容时,str要用encode方式转为bytes形式,否则报错TypeEr
ror: a bytes-like object is required, not ‘str’

str = '...'
# ⽂本 = Unicode字符序列
# 相当于 string 类型
str = b'...'
# ⽂本 = ⼋位序列(0到255之间的整数)
# 字节⽂字总是以‘b’或‘B’作为前缀;它们产⽣⼀个字节类型的实例,⽽不是str类型。
# 相当于 byte[]

f = open('将进酒.txt', 'r+')
str = '\n作者:李⽩' f.seek(0, 2)
line = f.write(str) f.seek(0, 0)
for each in f:
 print(each)
# 君不⻅,⻩河之⽔天上来,奔流到海不复回。
# 君不⻅,⾼堂明镜悲⽩发,朝如⻘丝暮成雪。
# ⼈⽣得意须尽欢,莫使⾦樽空对⽉。
# 天⽣我材必有⽤,千⾦散尽还复来。
# 烹⽺宰⽜且为乐,会须⼀饮三百杯。
# 岑夫⼦,丹丘⽣,将进酒,杯莫停。
# 与君歌⼀曲,请君为我倾⽿听。
# 钟⿎馔⽟不⾜贵,但愿⻓醉不复醒。
# 古来圣贤皆寂寞,惟有饮者留其名。
# 陈王昔时宴平乐,⽃酒⼗千恣欢谑。
# 主⼈何为⾔少钱,径须沽取对君酌。
# 五花⻢,千⾦裘,呼⼉将出换美酒,与尔同销万古愁。
# 作者:李⽩
f.close()

8.fileObject.writelines(sequence):向文件写入一个序列字符串列表,如果需要换行则需要自己加入换行符\n

f = open('test.txt', 'w+')
seq = ['⼩⻢的程序⼈⽣\n', '⽼⻢的程序⼈⽣'] f.writelines(seq) f.seek(0, 0)
for each in f:
 print(each)
 
# ⼩⻢的程序⼈⽣
# ⽼⻢的程序⼈⽣
f.close()

简介的with语句

关键词with语句可以保证诸如文件之类的对象在使用完之后一定会正确的执行它的清理方法

try:
   f = open('myfile.txt', 'w')
   for line in f:
      print(line)
except OSError as error:
   print('出错啦!%s' % str(error))
finally:
   f.close()
# 出错啦!not readable

try:
   with open('myfile.txt', 'w') as f:
        for line in f:
            print(line)
except OSError as error:
    print('出错啦!%s' % str(error))
# 出错啦!not readable

OS模块中关于文件\目录常用的函数

OS模块,不需要关系什么操作系统下使用什么模块,OS模块会帮你选择正确的模块并调用
os.getcwd():返回当前的工作目录
os.chdir(path):改变当前的工作目录到指定的路径

import os
path = 'C:\\'
print("当前⼯作⽬录 : %s" % os.getcwd())
# 当前⼯作⽬录 : C:\Users\Administrator\PycharmProjects\untitled1
os.chdir(path)
print("⽬录修改成功 : %s" % os.getcwd())
# ⽬录修改成功 : C:\

1.listdir (path=’.’)返回path指定的文件夹包含的文件或文件夹的名字的列表

import os
dirs = os.listdir()
for item in dirs:
 print(item)

2.os.mkdir(path)创建单层目录,如果该目录已存在抛出异常

import os
if os.path.isdir(r'.\b') is False:
 os.mkdir(r'.\B')
 os.mkdir(r'.\B\A')
os.mkdir(r'.\C\A') # FileNotFoundError

3.os.makedirs(path)递归创建多层目录,如果该目录已存在抛出异常

import os
os.makedirs(r'.\E\A')

4.os.remove(path)用于删除指定路径的文件。如果指定路径是一个目录,将抛出0SError
例:创建一个.\E\A\text.txt文件然后进行删除

import os
print("⽬录为: %s" % os.listdir(r'.\E\A'))
os.remove(r'.\E\A\test.txt')
print("⽬录为: %s" % os.listdir(r'.\E\A'))

5.os.rmdir(path)用于删除单层目录,仅当该文件夹是空的才可以,否则抛出OSError
例:创建.\E\A目录然后进行删除

import os
print("⽬录为: %s" % os.listdir(r'.\E'))
os.rmdir(r'.\E\A')
print("⽬录为: %s" % os.listdir(r'.\E'))

6.os.removedirs(path)递归删除目录,从子目录到父目录逐层尝试删除,遇到目录非空则抛出异常
例:创建.\E\A目录然后进行删除

import os
print("⽬录为: %s" % os.listdir(os.getcwd()))
os.removedirs(r'.\E\A') # 先删除A 然后删除E
print("⽬录为: %s" % os.listdir(os.getcwd()))

7.os.rename(src, dst)用于命名文件或目录,从src到dst,如果dst是一个存在的目录,将抛出OS
Error
例:把test.txt重命名为test2.txt

import os
print("⽬录为: %s" % os.listdir(os.getcwd()))
os.rename("test.txt", "test2.txt")
print("重命名成功。")
print("⽬录为: %s" % os.listdir(os.getcwd()))

8.os.system(command)运行系统的shell命令(将字符串转化为命令)
例:先自行创建一个a.py文件,然后由shell命令打开

import os
path = os.getcwd() + '\\a.py'
a = os.system(r'python %s' % path)
os.system('calc') # 打开计算器

序列化与反序列化

Python中的pickle模块实现了基本的数据序列和反序列化
通过pickle模块的序列化操作我们能将程序中运行的对象信息保存到文件中去,永久储存
通过pickle模块的反序列化操作,我们能够从文件中创建上一次程序保存的对象
pickle.dump(obj, file, [,protocol])将obj对象序列化存入已经打开的file中
obj:想要序列化的obj对象
file:文件名称
protocol:序列化使用的协议,如果该项省略,则默认为0;如果为负值或者HIGHEST_PROTOCOL,则使用最高的协议版本

pickle.load(file)将file中的对象序列化读出

import pickle
dataList = [[1, 1, 'yes'],
           [1, 1, 'yes'],
           [1, 0, 'no'],
           [0, 1, 'no'],
           [0, 1, 'no']]
dataDic = {0: [1, 2, 3, 4],
           1: ('a', 'b'),
           2: {'c': 'yes', 'd': 'no'}}
# 使⽤dump()将数据序列化到⽂件中
fw = open(r'.\dataFile.pkl', 'wb')
# Pickle the list using the highest protocol available.
pickle.dump(dataList, fw, -1)
# Pickle dictionary using protocol 0.
pickle.dump(dataDic, fw)
fw.close()
# 使⽤load()将数据从⽂件中序列化读出
fr = open('dataFile.pkl', 'rb')
data1 = pickle.load(fr)
print(data1)
data2 = pickle.load(fr)
print(data2)
fr.close()
# [[1, 1, 'yes'], [1, 1, 'yes'], [1, 0, 'no'], [0, 1, 'no'], [0, 1, 'no']]
# {0: [1, 2, 3, 4], 1: ('a', 'b'), 2: {'c': 'yes', 'd': 'no'}}

练习题

1.打开中文字符的文档时,会出现乱码,Python自带的打开文件是否可以指定文字编码?还是只能用相关函数?
open(file, mode=‘r’, buffering=None, encoding=None, errors=None, newline=None, closefd=True) 在mode中设置文件打开的编码形式
2.

"""  
Input file
   t.txt
   The satellite will be mainly used for land surveys, city planning, land right confirmation, road network design, crop yield estimation and disaster prevention and mitigation.
It will also provide information for the development of the Belt and Road Initiative.
Output file
   略
"""
import re

def longest_word(filename):
    f = open(filename, mode='r')
    lst1 = f.readlines()
    lst2 = []
    lst3 = []
    for i in range(len(lst1)):
        str1 = lst1[i]
        lst2 = lst2 + re.split(' |,|\n', str1) # 不能把英文的句号加进去
    temp = len(lst2[0])
    lst3.append(lst2[0])
    ind = 0
    for j in range(len(lst2)-1):
        if len(lst2[j+1]) > temp:
            lst3 = []
            temp = len(lst2[j+1])
            lst3.append(lst2[j+1])
            ind = j+1
        if len(lst2[j+1]) == temp:
            lst3.append(lst2[j+1])
    return lst3

print(longest_word("t.txt"))
# ['confirmation', 'confirmation']
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值