文件操作
1.大数据的文件读取
- 读取文件时,如果文件过大,则一次读取全部内容到内存,容易造成内存不足,所以要对大文件进行批量的读取内容。
- python读取大文件通常两种方法:第一种是利用yield生成器读取;第二种是:利用open()自带方法生成迭代对象,这个是一行一行的读取。
# 利用yield生成器读取
# import random
def read_big_file(file_path, size=1024, encoding='utf-8'):
with open(file_path, 'r', encoding=encoding) as f:
while True:
part = f.read(size)
if part:
yield part
else:
return None
file_path = 'data/big_data.txt'
size = 100 # 每次读取指定大小的内容到内存,为了测试更加明显,这儿写的小一些
# 注意:以'a'追加模式下,大文件也不会占用太多内存
for part in read_big_file(file_path, size):
with open('data/new_big_data.txt', 'a', encoding='utf-8') as w:
w.write(part)
print(part)
print('*' * 100)
# 利用open()自带方法生成迭代对象
file_path = 'data/big_data.txt'
new_file_path = 'data/new_big_data.txt'
with open(file_path, 'r', encoding='utf-8') as f:
for line in f:
print(line)
with open(new_file_path, 'a', encoding='utf-8') as a:
a.write(line)
2.在python中编译和链接的过程是什么?
- 编译:python中的源代码保存为.py文件,然后将其编译为称为字节码的格式,然后将字节码转换为机器码。编译后,代码存储在.pyc文件中,并在更新源代码时重新生成。此过程称为编译。
- 链接:链接是最后一个阶段,其中所有功能都与它们的定义链接在一起,因为链接器知道在哪里实现所有这些功能。此过程称为链接。
3.请写一个Python逻辑,计算一个文件中的大写字母数量
with open('xxxx.txt','r') as file:
count=0
content=file.read()
for i in content:
if i.isupper():
count+=1
print(count)
4.介绍一下except的用法和作用?
- 异常处理
- 捕捉异常可以使用try/except语句
- try/except语句用来检测try语句块中的错误,从而让except语句捕获异常信息并处理。
- 如果你不想在异常发生时结束你的程序,只需在try里捕获它。
try:
<语句> #运行别的代码
except <名字>:
<语句> #如果在try部份引发了'name'异常
except <名字>,<数据>:
<语句> #如果引发了'name'异常,获得附加的数据
else:
<语句> #如果没有异常发生
5.要打开文件c:\ s.txt进行编写,我们使用:
open(“c:\s.txt”,“w”)
6.何时执行try-except-else的else部分?
当没有异常发生时,执行else部分。
7. 简述with方法打开处理文件帮我我们做了什么?
使用with open()的方式打开文件进行操作,如果在读或写的过程中发生了异常,with 会帮我们close文件。如果用try …
except … finally 方式可以实现同样的效果,在finally中关闭文件。但这样写太麻烦了,不如with open 方便。
8.用python删除文件和用linux命令删除文件方法
- Linux命令删除(基本格式:rm [选项] 文件或目录)
(1)-f:强制删除(force),和 -i 选项相反,使用 -f,系统将不再询问,而是直接删除目标文件或目录。
(2)-i:和 -f 正好相反,在删除文件或目录之前,系统会给出提示信息,使用 -i 可以有效防止不小心删除有用的文件或目录。
(3)-r:递归删除,主要用于删除目录,可删除指定目录及包含的所有内容,包括所有的子目录和文件。- 删除文件:rm -f /文件路径
- 删除文件夹 :rm -r /文件夹路径
- Python代码删除
- os删除文件或者文件夹
- shutil 删除
import os
os.remove(path) # path是文件的路径,如果这个路径是一个文件夹,则会抛出OSError的错误,这时需用用rmdir()来删除
os.rmdir(path) # path是文件夹路径,注意文件夹需要时空的才能被删除
os.unlink('F:\新建文本文档.txt') #unlink的功能和remove一样是删除一个文件,但是删除一个删除一个正在使用的文件会报错。
import shutil
file_path = '/path'
shutil.rmtree(file_path)
9.写一段自定义异常代码
class TooLongExceptin(Exception):
"this is user's Exception for check the length of password "
def __init__(self,leng):
self.leng = leng
def __str__(self):
print("密码长度是"+str(self.leng)+",超过长度了")
10.举例说明异常模块中try except else finally的相关意义
- try:把可能出现的异常代码放进try中,代表异常处理即将要处理的代码段。
- except xxx:捕获异常,xxx表示异常类型,如果你大概知道代码会报出什么异常,那么我们可以直接把具体异常类型类型填上。执行过程中,出现了xxx异常,那么该段代码就会执行。
- else:当try段代码能够正常执行,没有出现异常的情况下,会执行else段代码。
- finally:不管有没有异常,最终都会执行。
11.r、r+、rb、rb+文件打开模式区别
- r 操作的是文本文件
- rb 操作的非文本文件(图片、视频、音频),使用rb模式不用写编码格式
- r+ 读并追加,必须先读后加,如果先写后读,会对之前的数据进行覆盖,如果覆盖与被覆盖元素的字符码不一样那么就会报错
- rb+ 读写打开一个二进制文件,允许读写数据,文件必须存在。
12.如何用Python找出你目前在哪个目录?
- sys.path[0]是调用Python解释器的当前脚本所在的目录。
- sys.argv[0]是脚本的名字(由系统决定是否是全名)
13.如何以相反顺序展示一个文件的内容?
for line in reversed(open("filename").readlines()):
print line.rstrip()
14.4G 内存怎么读取一个 5G 的数据?
可以通过生成器,分多次读取,每次读取数量相对少的数据(比如 500MB)进行处理,处理结束后在读取后面的 500MB 的数据。
15.Python 中的 os 模块常见方法?
方法名 | 作用 |
---|---|
os.getcwd() | 返回当前工作目录 |
os.chdir(path) | 改变工作目录 |
os.listdir(path) | 列举指定目录中的文件名和目录名 |
os.mkdir(path) | 创建单层目录 |
os.makedirs(path) | 递归创建目录 |
os.remove(path) | 删除文件 |
os.rmdir(path) | 删除单层目录 |
os.removedirs() | 递归删除目录 |
os.system(command) | 运行系统的shell命令 |
os.rename(old,new) | 将老的文件名或目录重新命名为新的文件名或目录 |
os.curdir | 代表当前目录 |
os.pardir | 代表上一级目录 |
16.python的read() 、readline()、readlines()
- 1、read()
特点:读取整个文件,返回的是一个字符串对象。
缺点:如果文件非常大,尤其是大于内存时,无法使用read()方法。 - 2、readline()
特点:每次读取一行,返回的是一个字符串对象,保持当前行的内存。这种方法读取时占用内存小,比较适合大文件读取。
缺点:比readlines慢得多。 - 3、readlines()
特点:一次性读取整个文件所有行,保存在一个列表(list)变量中,每行作为一个元素。
缺点:读取大文件会比较占内存。
17.使用代码实现查看列举目录下的所有文件
# 修改工作目录
import os
os.chdir(r'C:\Users\admin\Desktop')
# 定义函数
def list_all_files(rootdir):
import os
_files = []
# 列出文件夹下所有的目录与文件
list = os.listdir(rootdir)
for i in range(0, len(list)):
# 构造路径
path = os.path.join(rootdir, list[i])
# 判断路径是否为文件目录或者文件
# 如果是目录则继续递归
if os.path.isdir(path):
_files.extend(list_all_files(path))
if os.path.isfile(path):
_files.append(path)
return _files
# 执行
dir = r'C:\Users\Hider\Desktop\python' # 目录地址
list_all_files(dir)
18.设计实现遍历目录与子目录,抓取.pyc文件
import os
def path(name):
"""
本次抓取文件使用的是递归调用
"""
for i in os.listdir(name): # 遍历文件
if os.path.isfile(os.path.join(name, i)): # 判断i是文件还是目录
if i[-4:] == ".pyc": # 如果i是文件判断i后四位是否是.pyc文件,如果是输出
print(os.path.join(i))
else:
path(os.path.join(name, i)) # 当i是目录的时候继续调用path
path("./haha") # 传入文件路径