python从入门到就业-作用域、文件操作

定义:变量的作用范围
python是静态作用域,变量的作用域取决于变量在代码里面的未知,在不同的位置,可能有不同的命名空间。

命名空间

是作用域的体现形式
表示了不同的具体的操作范围

分类

L-Local 函数内的命名空间

作用空间:当前整个函数体范围内

E-Enclosing function locals 外部嵌套函数的命名空间

作用范围:闭包函数
def test():
    b = 6   #E
    def test1(): #E
        print("1") #E

G-Global 全局变量

作用范围:当前模块(文件

B-Builtin 内建模块命名空间

作用范围:所有模块(文件
比如:print函数
按照L>E>G>B的顺序查找
python里面没有块级的作用域,比如:if 、while
if 1:
    a = 1
print(a) #1

局部变量

在一个函数内部定义的变量;
作用域是函数内部
查看局部变量:locals()
查看全局变量:globals()

内层不能修改外层的变量,除非使用nonlocal在变量前方声明,但nonlocal仅仅适用于闭包函数内使用外层的变量。不可以用于内层函数访问外层变量,应该使用global!

a = 100
def test():
    nonlocal a 
    a = 8
    print(a)
test()
print(a) #SyntaxError: no binding for nonlocal 'a' found
a = 100
def test():
    global a 
    a = 8
    b =10
    print(a)
    print(locals()) #{'b': 10}
    print(globals()) #{'__name__': '__main__', '__doc__': 'Automatically created module for IPython interactive environment', '__package__': None, '__loader__': None, '__spec__': None, '__builtin__': <module 'builtins' (built-in)>, '__builtins__': <module 'builtins' (built-in)>, '_ih': ['', 'def test():\n    b = 6\n    def test1():\n        print("1")', 'if 1:\n    a = 1\nprint(a)', 'def test():\n    a = 1\n    print(a)\nhelp(locals)', 'def test():\n    a = 1\n    print(a)\nhelp(locals())', 'def test():\n    a = 1\n    print(a)\nlocals()', 'def test():\n    a = 1\n    print(a)\nlocals()', 'def test():\n    a = 1\n    print(a)', 'a = 100\ndef test():\n    nonlocal a \n    a = 8\n    print(a)\ntest()\nprint(a)', "a = 100\ndef test():\n    global a \n    a = 8\n    print(a)\ntest()\nprint(a) #SyntaxError: no binding for nonlocal 'a' found", 'a = 100\ndef test():\n    global a \n    a = 8\n    print(a)\n    print(locals())\ntest()#8\nprint(a) #8', 'a = 100\ndef test():\n    global a \n    a = 8\n    b =10\n    print(a)\n    print(locals()) #{}\ntest()#8\nprint(a) #8', "a = 100\ndef test():\n    global a \n    a = 8\n    b =10\n    print(a)\n    print(locals()) #{'b': 10}\n    print(globals())\ntest()#8\nprint(a) #8"], '_oh': {5: {...}, 6: {...}}, '_dh': [WindowsPath('D:/file/python学习')], 'In': ['', 'def test():\n    b = 6\n    def test1():\n        print("1")', 'if 1:\n    a = 1\nprint(a)', 'def test():\n    a = 1\n    print(a)\nhelp(locals)', 'def test():\n    a = 1\n    print(a)\nhelp(locals())', 'def test():\n    a = 1\n    print(a)\nlocals()', 'def test():\n    a = 1\n    print(a)\nlocals()', 'def test():\n    a = 1\n    print(a)', 'a = 100\ndef test():\n    nonlocal a \n    a = 8\n    print(a)\ntest()\nprint(a)', "a = 100\ndef test():\n    global a \n    a = 8\n    print(a)\ntest()\nprint(a) #SyntaxError: no binding for nonlocal 'a' found", 'a = 100\ndef test():\n    global a \n    a = 8\n    print(a)\n    print(locals())\ntest()#8\nprint(a) #8', 'a = 100\ndef test():\n    global a \n    a = 8\n    b =10\n    print(a)\n    print(locals()) #{}\ntest()#8\nprint(a) #8', "a = 100\ndef test():\n    global a \n    a = 8\n    b =10\n    print(a)\n    print(locals()) #{'b': 10}\n    print(globals())\ntest()#8\nprint(a) #8"], 'Out': {5: {...}, 6: {...}}, 'get_ipython': <bound method InteractiveShell.get_ipython of <ipykernel.zmqshell.ZMQInteractiveShell object at 0x00000272674B9AC0>>, 'exit': <IPython.core.autocall.ZMQExitAutocall object at 0x000002726750BFD0>, 'quit': <IPython.core.autocall.ZMQExitAutocall object at 0x000002726750BFD0>, 'open': <function open at 0x0000027265981430>, '_': {...}, '__': {...}, '___': '', '_i': 'a = 100\ndef test():\n    global a \n    a = 8\n    b =10\n    print(a)\n    print(locals()) #{}\ntest()#8\nprint(a) #8', '_ii': 'a = 100\ndef test():\n    global a \n    a = 8\n    print(a)\n    print(locals())\ntest()#8\nprint(a) #8', '_iii': "a = 100\ndef test():\n    global a \n    a = 8\n    print(a)\ntest()\nprint(a) #SyntaxError: no binding for nonlocal 'a' found", '_i1': 'def test():\n    b = 6\n    def test1():\n        print("1")', 'test': <function test at 0x0000027265603550>, '_i2': 'if 1:\n    a = 1\nprint(a)', 'a': 8, '_i3': 'def test():\n    a = 1\n    print(a)\nhelp(locals)', '_i4': 'def test():\n    a = 1\n    print(a)\nhelp(locals())', '_i5': 'def test():\n    a = 1\n    print(a)\nlocals()', '_5': {...}, '_i6': 'def test():\n    a = 1\n    print(a)\nlocals()', '_6': {...}, '_i7': 'def test():\n    a = 1\n    print(a)', '_i8': 'a = 100\ndef test():\n    nonlocal a \n    a = 8\n    print(a)\ntest()\nprint(a)', '_i9': "a = 100\ndef test():\n    global a \n    a = 8\n    print(a)\ntest()\nprint(a) #SyntaxError: no binding for nonlocal 'a' found", '_i10': 'a = 100\ndef test():\n    global a \n    a = 8\n    print(a)\n    print(locals())\ntest()#8\nprint(a) #8', '_i11': 'a = 100\ndef test():\n    global a \n    a = 8\n    b =10\n    print(a)\n    print(locals()) #{}\ntest()#8\nprint(a) #8', '_i12': "a = 100\ndef test():\n    global a \n    a = 8\n    b =10\n    print(a)\n    print(locals()) #{'b': 10}\n    print(globals())\ntest()#8\nprint(a) #8"}

test()#8
print(a) #8

注意事项

执行顺序!
把全局变量放在最前面
一般可以用g_name来命名全局变量
a = 1
def test():
    print(a)
    print(b)
b = 10
test() #1 10
a = 1
def test():
    print(a)
    print(b)
test() #NameError: name 'b' is not defined
b = 10

文件

概念

数据存储的容器,我们所操作的单位。
作用:持久的存储数据内容。

组成

文件名:在同级目录下,不能有俩个同名的文件存在。
扩展名:指明了文件类型。一般不同的扩展名,对应着不同的文件格式。
不同的文件格式,有着不同的存储约定,方便程序处理。
文件内容
文件句柄:通过句柄向文件内写内容或者读取内容。

打开文件

相对路径:相对于哪一个目录下面的指定文件,相对于python源码文件的目录路径

r-只读模式

是默认模式,文件的指针被放在文件的开头
注意! 如果文件不存在,则会报错
debug: 'gbk' codec can't decode byte 0x81 in position 19: incomplete multibyte sequence
python中默认的编码方式是 “ gbk ”,Windows的文件默认的编码方式是 “ utf-8 ”。
#open("文件","模式")
#文件指定文件路径 模式指明控制操作模式,默认是r
f = open("test.txt", "r", encoding = "UTF-8")  #返回一个文件对象,文件句柄
content = f.read()
print(content) #Hello World!!!
f.write("123") #UnsupportedOperation: not writable
f.close()

w-只写模式

以只写的模式打开文件
文件的指针会放在文件的开头,写入新的内容,会覆盖掉源文件的内容
注:文件不存在时候,会自动创建一个文件
#open("文件","模式")
#文件指定文件路径 模式指明控制操作模式,默认是r
f = open("test.txt", "w")  #返回一个文件对象,文件句柄
f.write("123") 
#print(f.read())#UnsupportedOperation: not readable
f.close()

a-追加模式

以只写的模式打开文件
文件的指针会放在文件的末尾,写入新的内容,会新增在原文件末尾
注:文件不存在时候,会自动创建一个文件
#open("文件","模式")
#文件指定文件路径 模式指明控制操作模式,默认是r
f = open("test.txt", "a")  #返回一个文件对象,文件句柄
f.write("Hello World") 
print(f.read())#UnsupportedOperation: not readable
f.close()

增加b:rb、wb、ab

以二进制格式进行操作文件读写
如果文件是二进制文件,则选择此项:图片、视频、音频
p = open("p1.jpg", "rb")
p1 = p.read()
p.close()
g = open("p2.jpg", "wb")
g.write(p1[0 : len(p1)//2])
g.close()

增加+:rb+、wb+、ab+、r+、w+、a+

代表都是读写模式进行打开,其他特性和+前面的模式基本一致、但是关于部分操作有细微区别。
r+是只覆盖前面的部分、w是将内容完全覆盖
如果在r+里面进行了俩个操作,读和写并且写在读的后面,那么实质上读之后会把指针放在最后。

文件读写

定位操作

f = open("test.txt", "r")
#f.seek(offset, whence) offset是便宜量 whence是相对于什么位置进行偏移
#0表示流的开始位置 是默认值
#1表示当前流的位置 
#2表示流的最后一部分
print(f.read())#123Hello WorldHello World
f.seek(2) 
print(f.read()) #3Hello WorldHello World

#f.tell()说明当前文件指针的位置到底在哪
print(f.tell()) #25
f.close() 
f = open("test.txt", "rb")
#f.seek(offset, whence) offset是便宜量 whence是相对于什么位置进行偏移
#0表示流的开始位置 是默认值
#1表示当前流的位置 
#2表示流的最后一部分
#文本文件的话 第二个参数只能是0
#只有二进制文件才能写1/2
f.seek(-2, 2) 
print(f.read()) #b'ld'

#f.tell()说明当前文件指针的位置到底在哪
print(f.tell()) #25
f.close() 

#f.read(字节数)
#字节数默认是文件内容长度
#下标会自动后移
f = open("test.txt", "r")
print(f.read()) #123Hello WorldHello World
f.close()
f = open("test.txt", "r")
print(f.read(3)) #123
f.close()
#f.readline([limit]) 读取一行数据
f = open("test.txt", "r")
print(f.readline(), end = "") #123
print(f.readline(), end = "") #Hello

#f.readlines()
#会自动的将文件按换行符进行处理
#将处理好的每一行组成列表返回
f = open("test.txt", "r")
print(f.readlines())  #['123\n', 'Hello\n', 'World\n', 'Hello\n', 'World']
#for in
#可以遍历f本身 还可以遍历行列表
f = open("test.txt", "r")
for i in f:
    print(i, end = "") #123 Hello World Hello World
import collections
print(isinstance(f, collections.Iterator)) #True
f.close()
#遍历行列表
f = open("test.txt", "r")
content = f.readlines()
for i in content:
    print(i, end = "")

判断文件是否可读

f = open("test.txt", "r")
print(f.readable()) #True
f.close()
readline和for in都适合读取内容体积比较大的文件:按行加载,节省内存,但是相对于整个读取的方法,性能较低。
read和readlines一次性读取文件中的所有内容:虽然占用了内存,但是处理性能比较高。

f = open("test.txt", "w")
if f.writable(): #判断文件能否写入
    print(f.write("123")) #3返回值是写入的字符长度
f.close()

关闭文件

为什么需要关闭?
1、可以释放系统资源
2、会立即清空缓冲区的数据内容到磁盘文件
f = open("test.txt", "w")
if f.writable(): #判断文件能否写入
    print(f.write("123")) #3返回值是写入的字符长度
f.flush()#立马将缓冲区的内容写入文件中去 清空缓冲区的内容到磁盘文件
f.close()

文件的相关操作

重命名

import os
#os.rename(src, dst) 将src文件改为dst文件
#os.rename("test.txt", "b.txt")
#os.rename("test", "b") #修改文件夹名称

#renames按照树状结构进行修改
os.renames("b/b.txt", "test/test.txt")

删除文件

import os
#os.remove 删除文件 文件不存在会报错
#os.remove("test/test.txt")

#os.rmdir(path) 
#不能递归删除目录 如果文件夹非空会报错
os.rmdir("test")

#os.removedirs(path) 
#会把整个路径中的所有层级目录全部删除
#如果文件夹非空会报错

创建文件夹

import os
#os.mkdir("文件夹名称" [,mode]) 
#mode是数字模式下的权限 默认为0o777 
#mode有三组 
#不能递归创建 不支持多级目录的创建
os.mkdir("a")

获取当前目录、目录内容列表、改变默认目录

import os
#获取当前目录
print(os.getcwd()) #D:\file\python学习
#改变默认目录
os.chdir("D:/file/python学习")
print(os.getcwd()) #C:\
#获取目录内容列表
print(os.listdir("./")) #./代表当前所在目录
os.listdir("../") #当前目录的上级目录

'''['$Recycle.Bin',
 '$WinREAgent',
 'Config.Msi',
 'Documents and Settings',
 'DumpStack.log.tmp',
 'hiberfil.sys',
 'OneDriveTemp',
 'pagefile.sys',
 'PerfLogs',
 'Program Files',
 'Program Files (x86)',
 'ProgramData',
 'Recovery',
 'swapfile.sys',
 'System Volume Information',
 'ti',
 'Users',
 'Windows']'''

案例

1 文件复制

import os
fread = open("b.txt", "r")
data = fread.read()
print(data)
fread.close()
fwrite = open("b1.txt", "w")
fwrite.write(data)
fwrite.close()
#大文件要考虑内存!
import os
source_file = open("b.txt", "r")
dst_file = open("b1.txt", "w")
content = source_file.read(1024)
while content:
    dst_file.write(content)
    content = source_file.read(1024)
    
source_file.close()
dst_file.close()

2 文件归类

import os
import shutil
#拿到文件名称列表
file_list = os.listdir()
#遍历所有的文件名称
for file_name in file_list:
    index = file_name.rfind(".")
    if index == -1:
        continue
    extension = file_name[index+1 : ]
    if not (os.path.exists(extension)):
        os.mkdir(extension)
    shutil.move(file_name, extension) #用于文件的移动

3 文件目录列举

import os
def list_files(dir, file):
    file_list = os.listdir(dir)
    for file_name in file_list:
        new_filename = dir + "/" +file_name
        if os.path.isdir(new_filename):
            f.write(new_filename + "\n")
            list_files(new_filename, file)
        else:
            f.write("\t"+new_filename + "\n")  
f = open("list.txt", "a")
list_files(os.getcwd(), f)
f.close()
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值