程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网:it98k.com

本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长

+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

2023-06(6)

Python的文件知识 (day07 课堂笔记)

发布于2019-09-09 12:21     阅读(1176)     评论(0)     点赞(19)     收藏(2)


  今天是Python基础数据类型的最后一课,今天主要学习的知识是文件。文件主要分为读文件,写文件,读写文件,写读文件.....

首先我们来说只读文件

#1,只读文件(‘绝对路径’)
f1 = open('d:\a.txt',mode='r',encoding='utf-8')
content = f1.read()
print(content)
f1.close()

  我们先看下绝对路径下的读文件:

  open(1,2,3):打开文件,open()里面的第一个参数是路径的意思,你存储的文件绝对路径,里面第二个参数是模式,‘r’在这里的意思是只读模式,里面的

             第三个参数encoding()是编码方式,一般默认的都是 utf-8 ,因为python文件传输存储的编码格式都是 utf -8。

  close()  :     关闭文件,我们在最后都要加上close(),如果不加,程序会一直执行,占用内存空间

  read()   :  只读,读取文件的内容

  我们在看下相对路径下的读文件

f1 = open('a',mode='r',encoding='utf-8')
content = f1.read()
print(content)
f1.close()

  我们不难看出相对路径和绝对路径的代码基本上来说是差不多的,有差别的只是open()的一个参数,路径,路径被换成了相对路径。在做程序时,我们使用的相对路径的频率远远高于绝对路径。所以我们以后默认使用相对路径,也希望大家以后也使用相对路径,少用或不用绝对路径,因为绝对路径一旦改变文件的位置,会找不到,会导致我们的程序报错。、

  说完了只读文件,下面来说只写文件(写文件我们也可以称创建文件):

#只写文件
f1 = open('a',mode='w',encoding='utf-8')
f1.write(' hello python ')
f1.close()

  相对于只读文件,我们来对比的来看只写文件,有差别的时open()的第二个参数,mode 由以前的 ‘r’ 换成了 ‘w’. 我们可以看下,执行完此程序的源文件

 hello python 

  对于只写文件,我们要来讲述一个知识点,open()的一个参数,路径。由于是写文件,所以存在文件的是否存在,如果文件不存在,就好说了,我们直接执行write(),把咱们要写的文件直接添加的路径下的文件就可以了,那么如果我们要写的文件之前就存在了呢,并且之前由数据了呢?我们怎么办。我们来看下如下代码:

a = open('1',mode='w',encoding='utf-8')
a.write('hello')        #hello
a.close()
b = open('1',mode='w',encoding='utf-8')
b.write('hi')
b.close()               #hi

  我们不难发现当我们往 1 这个文件里存储 ‘hello’ 以后,我们再存储‘hi’,源文件只剩 ‘hi’ 这个字符里,所以我们得出:对于写,没有此文件就会创建文件,如果有文件,就会把源文件内容删除,再写新的内容(覆盖)。

  讲述了只读文件和只写文件,我们对文件有了一些大概的了解,下面我们来说bytes类型的只读和只写文件。下面来看下代码:

复制代码
只写文件:
a = open('1',mode='wb') a.write('hello'.encode('utf-8')) #hello a.close()

只读文件:
a = open('1',mode='rb')
content = a.read()
print(content)
a.close()
复制代码

  下面我首先来说下bytes类型,bytes类型是以 utf-8 的编码方式编码的一种类型,那么我们为什么用bytes ? 我们在刚才学习的只读和只写,只能读取和写入一些文本信息,在我们的生活中,肯定不可能都只是文本,应该也会大量浏览图片或者音频等其他的方式,那么bytes的作用就来了,它是用于非文字类的文件上传和下载时使用。

  首先说下bytes类型的只读文件,首先open()第三个三个参数被取消了,不再用编码(encoding),它是以什么方式存储,就打开什么方式。

  最后我们说下read(),我们知道,content的数据类型读取的是bytes类型,但是打印出来content却是str, 那么问题来了,(因为str采用的是Unicode的编码方式,而我们上传下载和存储的bytes编码方式是utf-8,但是却打印出来了字符串,) 这是为什么呢?

  是read() , 隐藏了 bytes -> str

  下面说下bytes类型的只写文件,同样open()第三个三个参数被取消了,不再用编码(encoding),但是相对于之前的只写文件却出现了一些差异,我们在write()里面进行了编码的转化,eg.

a.write('hello'.encode('utf-8')) 

  很多人会问了,为什么这段代码什么意思?为什么这样写呢?
  其实还是那个意思,'hello',众所周知,它是str类型,str是什么编码方式?Unicode吧,但是在python中,上传下载不允许直接使用Unicode,默认支持的是‘utf-8’,同时encode()使str的方法,所以在这个位置进行修改编码方式

  讲完了只写文件,很多人就会问博主了,我们写入只能覆盖,可是这样始终只能存一个值啊,我们能不能存多份值呢,有什么方法吗?比如说我们列表的append()方法.......,其实我们文件也是有追加的:

复制代码
#追加:
a = open('1',mode='a',encoding='utf-8')
a.write('hello')
a.close()
#bytes类型:
a = open('1',mode='ab')
a.write('xiaoming'.encode('utf-8'))
a.close()
复制代码

  相对于只写的代码,我们可以看出,mode = 'a' ,它有以前的‘w’变成了‘a’,当然功能也随之改变,它是追加的意思,相当于列表的append()方法。(在之后我们就不具体说明bytes类型了,因为意思和之前所描述的只读和只写差不多,所以在之后就不进行过多的描述了。)

  那么我们很多人就会有疑问了,问什么‘a’能添加而‘w’却只能覆盖呢?在这里先大概说下,是光标的原因

r :光标在字符的最后面
w :光标在字符的最前面
a :光标移动到有文字的最后一位

  文件的读写:(只能进行一次读写)

# f = open('log',mode='r+',encoding='utf-8')
# print(f.read())
# f.close()
# f = open('log',mode='r+b')
# print(f.read())
# f.write('大猛,小孟'.encode('utf-8'))
# f.close()

  文件的写读:

# f = open('log',mode='w+',encoding='utf-8')
# f.write('aaa')
# f.seek(0)
# print(f.read())
# f.close()

  文件的追加写读:

# f = open('log',mode='a+',encoding='utf-8')
# f.write('佳琪')
# f.seek(0)
# print(f.read())
# f.close()

  下面来介绍文件的方法:

复制代码
# obj = open('log',mode='r+',encoding='utf-8')
# content = f.read(3)  # 读出来的都是字符
# f.seek(3)  # 是按照字节定光标的位置
# f.tell() 告诉你光标的位置
# print(f.tell())
# content = f.read()
# print(content)
# f.tell()
# f.readable()  # 是否刻度
# line = f.readline()  # 一行一行的读
# line = f.readlines()  # 每一行当成列表中的一个元素,添加到list中
# f.truncate(4)
# for line in f:
#     print(line)
# f.close()
复制代码

  在文件中,open()我们还有另外一种写法,比较常用,以后我们大多用这个写法:

# with open('log',mode='r+',encoding='utf-8') as f,\
#         open('log',mode='w+',encoding='utf-8') as f1:

  这个写法是不用写close()的。

  最后我介绍下断点续传的问题:

1.先知道光标的位置    -> tell()
2.将光标调制到特定的位置 -> seek(tell())

最后留一个小题:

  通过文件实现,之前做过的三次验证用户登陆:

复制代码
#方法一:

print('请先注册用户信息')
username = input('please input the username :')
password = input('please input the password :')
f1 = open('message',mode='w+',encoding='utf-8')
f1.write(username)
f1.seek(0)
f2 = open('password',mode='w+',encoding='utf-8')
f2.write(password)
f2.seek(0)
print('您准备注册还是登陆,如果登陆请输入G , 如果想继续注册输入 I ,如果退出请输入 E')
s1 = input('<<<')
if s1.upper() == 'G':
    i = 3
    while i > 0:
        user = input('please input the username :')
        word = input('please input the password :')
        if f1.read() == user and f2.read() == word:
            print('welcome to enter , loading......')
            break
        elif f1.read() != user or f2.read() != word:
            i -= 1
            print('Fuck off ,please input continue , you have ' + str(i) + ' times')
            continue
elif s1 .upper() == 'I':
    username = input('please input the username :')
    password = input('please input the password :')

    f1 = open('message', mode='w+', encoding='utf-8')
    f1.write(username)
    f1.seek(0)
    f2 = open('password', mode='w+', encoding='utf-8')
    f2.write(password)
    f2.seek(0)
else:
    exit('exiting....')

f1.close()
f2.close()


#方法二

username = input('please input the username :')
password = input('please input the password :')
with open('mess',mode='w+',encoding='utf-8') as f:
    f.write('{}\n{}'.format(username,password))
print('恭喜你注册成功!')
i = 0
a = []
while i < 3:
    user = input('please input the username :')
    pswd = input('please input the password :')
    with open('mess',mode='r+',encoding='utf-8')as f1:
        for line in f1:
            a.append(line)
        a[0] = a[0].rstrip('\n')
        if user == a[0] and pswd == a[1] :
            print('登陆成功!')
            break
        else:
            print('登陆失败')
            i += 1
复制代码

 

下面是3到关于文件的作业题:

复制代码
1. 文件a.txt内容:每一行内容分别为商品名字,价钱,个数。

apple 10 3

tesla 100000 1

mac 3000 2

lenovo 30000 3

chicken 10 3

通过代码,将其构建成这种数据类型:[{'name':'apple','price':10,'amount':3},{'name':'tesla','price':1000000,'amount':1}......] 并计算出总价钱。



li = []
with open('a',mode='r',encoding='utf-8') as f1 :
    for line in f1 :
        le = line.strip().split()
        if len(le) != 0 :
            lisl = {'name':le[0],'price':le[1],'amount':le[2]}
            li.append(lisl)
print(li)
num = 0
for lis in li:
    num = num + int(lis['price']) * int(lis['amount'])
print(num)


2,有如下文件:

-------

alex是老男孩python发起人,创建人。

alex其实是人妖。

谁说alex是sb?

你们真逗,alex再牛逼,也掩饰不住资深屌丝的气质。

----------

将文件中所有的alex都替换成大写的SB。

with open('b',mode='r+',encoding='utf-8') as f1 :
    for i in f1:
        if 'alex' in i :
            i = i.replace('alex','SB')
            print(i)


3.进行文件的修改操作:

with open('text01',encoding='utf-8') as f1 ,open('text02','w',encoding='utf-8') as f2:
    for line in f1:
        if '你好啊' in line :
            line = line.replace('你好啊','hello')
        f2.write(line)
import os
os.remove('text01')
os.rename('text02','text01')
复制代码

 

之后我将开启自己Python的函数之旅..........

 

  

 

 

  

  

 



所属网站分类: 技术文章 > 博客

作者:djjdf

链接:https://www.pythonheidong.com/blog/article/104006/f172bce540aa1cff4201/

来源:python黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

19 0
收藏该文
已收藏

评论内容:(最多支持255个字符)