记录我的 学习历程-Day08 文件的操作文件操作的初识用 代码对文件进行各种操作。基本构成* 文件路径path* 打开方式读、写、追加、读写、写读……编码方式存在utf - 8 , gbk等 , f通过open函数打开文件 , 此文件路径为文件路径或者相对路径 , 其编码方式为指定的编码方式 , 模式为指定的模式。把f.read()获取的内容进行格式构成, 之后运用print(), 最后将f关闭 , 对其进行关闭操作 , 是f.close()。代码解释open​ 内置函数open 底层调用的是操作系统的接口。f变量, 那些约定俗成的变量名存在着(f1,fh,,f_h) , 此变量另外还有一个称谓, 称作文件句柄。针对文件开展的任何一种操作 , 都必须借助文件句柄加上 . 的这种方式。:​ 可以不写如果不写默认的编码本就是系统默认的编码。​ : gkb​ Linux: utf-8​ MacOS: utf-8mode​ 就是定义你的操作方式r 为读模式。f.read():如果你渴望对文件展开操作, 像是去读取文件, 亦或是给文件写入内容, 诸如此类的情况, 通通都得借助文件句柄加以操控来进行。f.colse():​ 关闭文件。必须关闭否则会常驻内存。文件操作的三个步骤打开文件。对文件句柄进行相应的操作。关闭文件。以读取模式, 采用utf - 8编码方式, 打开名为文件.txt的文件, 获取文件句柄, 将其赋值给变量f , 默认打开模式即为r。经由句柄来对文件予以操作, date等于f读取的内容, 随后关闭文件f。报错的原因文件存储时与文件打开时编码本不一致。路径分隔符产生的问题所采用的解决办法是, 于路径之前添加一个r, 这个r是这样的形式, rC:\Users\\文件.txt。文件操作的读文件操作里的读, 存在四种模式, 分别是r、rb、r、rb , 其中r和rb不常被使用, rb的模式 句号。进行操作的是并非文本类型的文件, 举例而言, 像图片、视频、音频这类文件。每一种模式存在五种方式, 分别为read()、read(n)、()、()、for。r 模式就只读方式去打开文件, 此文件的指针会被放置于文件的开头位置, 这属于文件所要进行操作之时极易被常用到的模式, 同时它也是默认的模式。要是一个文件并未设置mode, 那么在操作文件的时候默认会采用r模式。举例:首先, 将文件对象f赋值为通过打开名为文件.txt的文件, 以读取模式且编码为utf - 8而得到的结果, 接着, 把从文件对象f中读取到的内容赋值给变量msg, 最后, 关闭文件对象f。print(msg)read() 一次性全部读取read() 会把文件里头的全部内容读取出来, 其存在的弊端在于, 要是文件规模很大的话, 那便会相当占用内存, 进而极易致使内存崩溃。把f赋值为打开名为“测试”的文件, 其模式为读取模式, 编码格式为“utf - 8”, 将读取到的内容赋值给msg, 关闭f, 打印msg。# 输出结果: 这是一行用于测试的内容A 部分为这是第二行, B 部分为这是第三行, C 部分为这是第几行, D 部分为这是行数处于连我自己也不清楚的不知具体状态的行, 就这么地吧。read(n) 指定读取到什么位置在 r 模式下,n 按照字符读取你提供的代码存在错误, 正确的应该是: f open(测试, moder, utf-8) , msg f.read(4) , f.close()。改写后: 打开名为测试的文件, 以读取模式并采用utf - 8编码方式, 读取四个字符存入变量msg, 之后关闭该文件。print(msg) # 输出结果: 这是一行() 按行读取() 每次只读取一行,注意: ()需要读取出来的数据, 在后面都存在一个\n, 要解决这一问题, 只借助在因读取而得出的文件后边添加一个strip()就可以了。f.这个句子不太完整且表意不明, 不太能按照要求准确改写。请补充完整清晰的句子内容。执行print操作, 在其中打印msg1, 接着执行print操作, 在其中打印msg2, 然后执行print操作, 在其中打印msg3, 最后执行print操作, 在其中打印msg4, 其输出结果为: 这是一行测试, A为这是第二行, B为这是第三行。C:这是第几行() 返回一个列表返回一个列表, 该列表之中的每个元素, 皆是原文件的每一行, 要是文件规模很大, 占据内存, 极易导致崩盘。f.close() # 输出结果:引号内的内容是, “哎, 这是我也不清楚到底属于第几行的那种内容”, 引号外的内容是, “算了, 就这么着吧。”。上边这四种情况都不太理想, 要是文件特别大, 内容极其多, 它们就特别容易把内存撑到爆掉, 所以, 我们另外还有第五种办法。for 循环能够借助for循环来进行读取, 文件句柄属于一个迭代器, 其具备的特点是, 每一次循环时, 仅仅在内存中占用一行的数据, 极其节省内存。你提供的代码存在错误, 正确的代码应该是 f open(测试, moder, utf-8)。能够这样去写: print(line.strip()) #此类方式便是在逐行开展读取, 它便执行了后续的功能 。请你明确一下具体需求, 这句“print(f.())”表述不太清晰, 不太清楚要怎么改写, 你可以详细说明其功能或想要达成的效果等, 以便我更准确地为你改写。这算作一行用于测试的内容, 其中, 第一部分表述为, 这是第二行, 第二部分表述为, 这是第三行, 第三部分表述为, 这是第几行, 之后又有表述为, 这是我也不清楚是第几行, 就保持这样的状态吧。特别注意: 读完的文件一定必须要关闭rb 模式rb模式, 是要以二进制格式来打开一个文件, 此文件用于只读。文件指针会被放置在文件的开头位置。要记住, 下面所讲的情况也是与此相同的, 凡是带有b的都是以二进制的格式去操作文件, 它们主要是针对非文字文件记性操作, 比如图片、音频、视频等等。并且如果你要是带有b的模式操作文件那么不用声明编码方式。f1被打开, 其操作模式为读取字节模式, 读取的是名为图片.jpeg的文件, 读取后tu f1读取到的内容, 转而f1被关闭, 最终打印tu。 # 输出结果:。字节序为b\xff\xd8\xff\xe0\x00\\x00\x01\x01\x00\x00H\x00H\x00\x00\xff\xe1\x00\\x , 接着还有后续很长很多内容而此处进行了省略 , 有老长一片段了且省略不少 , 后面还有不少内容呢。rb模式存在read read(n) (),() 以及for循环这几种方式, 此处不会逐一进行展示。文件操作的写文件操作里用于写的模式会有四种, 它们分别是w、wb、w、wb这几种, 其中w与wb这两种模式通常不怎么被使用, 而wb这样一种模式。进行操作的是并非文本类型的文件, 举例来说, 诸如图片、视频以及音频这类文件。其操作的方法是, write(要写入的内容)操作方法是这样采用write语法并传递该要用于写入的特定详细内容。w 模式倘若文件并不存在, 然而以w模式对文件展开操作那么它会率先创建文件, 随后再写入内容。你提供的代码存在错误, 括号书写不正确。正确的代码及改写如下: f open(这是一个新创建的文件, w, utf-8), 然后, f.write(果然是一个新创建的文件)。分开来说就是, f被赋值为打开名为这是一个新创建的文件的文件, 以写入模式, 编码为utf-8 , 接着, f写入内容果然是一个新创建的文件。f.close()若文件是存在着的, 借助w模式去对文件开展操作, 先是要将原文件之中的内容给清空掉, 而后再去写入新的内容。哎, 你看, f被指派去打开一个名为这是一个新创建的文件的玩意, 并且, 指定用utf - 8作为编码方式, 同时呢采用写入模式, 接着, f去写入一段内容是这是清空后重新写入的内容。f.close()wb 模式wb模式, 是要以二进制格式去打开一个文件, 且仅仅是用于写入操作的。要是该文件已然存在, 那就会打开这个文件, 并且从开头之处开始进行编辑, 这意味着原有内容将会被删除掉。倘若该文件并不存在, 那就会创建新的文件。此模式一般是用于像图片、音频、视频等这类非文本文件的。举个例子 :我先是以rb的模式, 把一个图片的全部内容, 按照bytes类型读取出来, 之后呢, 再以wb的方式, 把读取出来的所有数据, 写入到一个新文件当中, 如此这般, 我就完成了类似于进行一个图片复制的流程。具体代码如下:首先, 把原图片以rb模式给读取出来, 接着, f等于打开名为图片.jpeg的文件, 其模式设定为rb模式, 随后, f读取该文件内容。f.将读取出来的数据, 通过wb模式, 写入新文件, 这是第二步 , f1 open(图片1.jpeg, modewb) , close() #。f1.write() f1.close()文件操作的追加也就是于文件里头增添内容。在此同样存在四种文件分类, 主要是四种模式, a模式, ab模式, a模式, ab模式, 而我们单单讲述着a模式。a 模式存在这样一种情况, 要是文件并不存在, 此时若利用a模式去操作文件, 那么就会出现这样的状况, 它会先去创建文件, 随后再写入内容。这种写法存在错误, 正确的应该是: f open(追加文本, a,utf-8) , f.write(这个文件是没有的,我是新创建的)。f.close()要是文件是存在着的, 借助a模式去对文件进行操作, 如此一来它就会于文件的最后之面去追加内容的。看起来你提供的代码存在一些错误呢。应该是f open(追加文本, a, utf-8) , 为你改写如下: 将文件对象f以追加模式、编码为utf - 8打开, 之后向该文件对象f写入内容, 内容为这是己存在的文件, 我是新追加的内容。f.close()文件操作的其它模式就还有一种模式没讲, 是那种带 号的模式。带 的模式是什么? 意味着加一个功能。像刚才讲的 r 模式是只读模式, 在这种模式下, 文件句柄只能做类似 read 的读操作, 不能做write这种写操作, 那要让文件句柄既能读又能写, 该怎么做? 接下来要说的就是这样的模式: r。一种模式是读写模式, 它是W写读模式, 还有一种模式是a写读模式, 另外还有rb这种以bytes类型的读写模式。在这儿呢咱们只说一种, 那就是r , 别的大同小异, 自己练练也就行了。打开文件的模式存在着, 默认为文本模式时, 有r, 即只读模式, 此为默认模式, 要求文件必须存在, 要是不存在的话则会抛出异常, 还有w那是只写模式, 其不可读, 若不存在则会创建, 若是存在则会清空内容。a, 一种只具备追加写模式的情况【此模式不具备可读特性当文件不存在时会进行创建操作而当文件存在时只会追加内容】 #2。我们对于非文本文件, 只能采用b模式, “b”意味着以字节的情形来操作, 而且所有文件都是采取字节的形式予以存储, 依照这种模式不用去考虑文本文件的字符编码, 不用考虑图片文件的jgp格式, 也不用考虑视频文件的avi格式。若使用 rb 方式打开, 当以 b 方式打开之时, 所读取到的内容为字节类型, 在进行写入操作之际, 同样需要提供字节类型, 并且不能够指定编码, 另外还有 #3、‘’模式, 此模式增添了一项功能。r, 进行读写操作, 其含义为可读且可写, w, 进行写读操作, 也就是可写并且可读, a, 同样是写读操作, 属于可写还可读, #4, 针对以bytes类型实行的操作, 涉及读写, 存在写读以及写读模式, rb, 用于读写二者兼具, 包含可读也包含可写。wb写读【可写可读】 ab写读【可写可读】r 模式 读并追加 顺序不能错读取并写入模式: 开启一个文件以供读取与写入, 该文件指针, 默认情况下, 将会被放置于文件的起始位置。调用print(), 将这是新写入的内容写入文件操作命名为f.write, 执行关闭文件操作命名为f.close。留意: 要是你处于读写模式下, 先是进行书写, 而后再去读取, 那么文件就会出现状况, 原因在于默认光标在文件的起始位置, 倘若你率先书写, 那么所写入的内容会将原本的内容予以覆盖, 直至覆盖到你写完的内容之处, 接着在后面部分开始读取。小总结:​ 三个大方向​ 读 四种模式 r rb r rb​ 写 四种模式 : w,wb, w,wb​ 追加 四种模式: a, ab, a,ab​ 相应的功能针对文件句柄所开展的操作有, 实行read操作, 执行read(n)操作, 进行()操作, 开展()操作, 以及实施write()操作。文件操作的其它功能f.tell() 获取光标的位置 单位是:字节请注意, 你提供的内容存在语法错误, 正确的代码应该是: f open(测试, r, utf-8), print(f.tell()), f.read()。改写后的句子: 打开名为测试的文件, 以读取模式并使用utf - 8编码方式打开, 输出文件指针当前位置, 读取文件内容。将文件指针当前位置打印出来, 之后关闭文件, 原文件内容为, 这是一行测试, A 所对应的内容是这是第二行, B 对应的是这是第三行, 有一个 C 对应的是这是第几行, 还有一个 D 对应的是这是我也不知道第几行。按照这样的状态就维持下去吧, # 输出的结果是0 # 起始的位置是122 # 结束的位置在那里。f.seek(), 它能够对光标的位置予以调整, 要注意, 其移动的单位是byte倘若面对的是utf-8编码的中文部分, 那么这个中文部分的字节数必须要是3的倍数, 这一点很关键, 得留意。你提供的代码存在错误, 正确的应该是: f open(测试, r, utf-8), f.seek(9), 内容 f.read()。按照要求改写应为: 开启关于 “测试” 的读取活动, 其为 utf - 8编码模式, 把读取指针移至九位置处, 进行读取内容操作。f.close(), 而print(), # 原文件内容, 这是一行测试, A:这是第二行, B:这是第三行, C:这是第几行, D:这是我也不知道第几行。就这么样了, # 输出是这样的结果, 行测试 A 呈现出这样的情况, 这是第二行, B 所对应的情况是这是第三行, C 的情况为这是第几行, D 的情况是这是我也不清楚到底是第几行, 就这么地吧。f.flush() 强制刷新这段代码存在错误, 正确的写法应该是: f open(测试, w, utf-8) , f.write(), 按照要求改写后为: f 通过 open 方法, 以 w 模式, 编码为 utf - 8 打开名为 测试 的文件, 之后 f 执行 write 方法写入空字符串。f.flush() f.close()打开文件的另一种方式(常用的是这种)with open() as ....好处一: 无需手动去关闭文件句柄。借助with上下文管理这般形式, 它能够自动将文件句柄予以关闭。通过open(测试。对于以utf - 8为编码, 模式为r打开文件并命名为f的情况, 执行打印f读取内容的操作。优点2是能够添加多个打开操作, 在一个with语句块中。首先, 你提供的代码存在错误, 正确写法应该是with open(测试, r, utf-8) as f这里调整回到正确格式。改写后的句子: 文件句柄能通过语句对多个文件进行操作而带来多个, 测试文件以读模式且采用utf-8编码被打开时, 随着打开语句中那个被指定为f的文件句柄存在于该声明范围之中。f1.write()这儿得留意一个状况, 虽说借助于with语句的形式去打开文件, 无需你亲自去做关闭文件句柄这个动作, 相对来讲较为省事, 不过依赖它来自动关闭文件句柄是存在一定时段的, 而这段时间并非固定不变的, 于是在此处便会引发某些问题, 要是你于with语句里凭借r模式去打开t1文件, 那么当你在后续再以a模式去打开t1文件时, 此刻极有可能在你第二次打开t1文件之际, 第一次打开时的文件句柄尚未被关闭掉, 进而或许就会出现差错, 其针对该情况的解决办法必须是在你第二次打开此文件之前, 手动去关闭上一回打开的文件句柄。文件的修改存放于硬盘上的是文件的数据, 所以只存在着覆盖这种情况, 不存在修改这一说法, 我们平时所看到的修改文件, 那都是模拟出来的效果, 详细来讲有两种实现方式文件操作改的流程1以读的模式打开原文件。2以写的模式创建一个新文件。3将原文件的内容读出来修改成新内容写入新文件。4将原文件删除。5将新文件重命名成原文件。方式一: 把硬盘所存该文件的全部内容加载至内存内存里是能够修改的, 修改完后, 再从内存覆盖到硬盘如word, vim, 这类编辑器。在以utf - 8编码方式, 模式设定为w的情况下创建一个名为f2的对象, 将f1所读取的内容进行赋值操作, 这里是全部读入内存, 要是文件规模很大, 会出现卡死的情况。这是一段代码, 它进行了这样的操作, 首先有一个等于号, 后面跟着一个点, 点后面是一对单引号括起来的文和wen, 这是在内存中完成修改的一种形式呢, 然后是f2.write这部分代码执行相应操作。对新文件进行一次性写入操作时候, 使用os.(测试) , 删除原文件的时候, 使用os.(测试.bak, 测试) , 把新建的文件重命名为原文件。那个原文件所具备的内容是这样的, 有着关于文件操作更改的流程: 其一, 要以读的那种模式去把原文件给打开。其二, 要以写的那种模式去创建出一个新的文件。其三, 要把原文件之中的内容给读出来, 并且修改成为新的内容, 之后写入到新文件里面。把原文件从中删除掉, 把新文件重新命名为原文件, 文件操作更改的流程是, 以读的模式将原文件打开。2, 通过以写的样式去创建一个全新的wen件。3, 把原有的wen对应的材料读出来, 改变成为新的内容, 然后写进新的wen件里面。4, 把原来的wen件给拿掉。5, 把新的wen件重新取一个名字, 让它成为原wen件。方式之二: 将于硬盘存放着的那个文件的内容, 逐行往内存里读取, 于修改完毕之后, 就把其写入到新的文件之中, 最终借助新文件去覆盖源文件此乃是较为常用的。这看起来不像是一个完整且正确的代码片段呀, 你提供的内容存在格式错误, 不太能按照要求准确改写。请检查并提供正确完整的内容以便进行改写。(以utf - 8编码, 模式为w打开文件, 命名为f2), 对于f1中的每一行: (进行逐行修改, 这种方式占内存较少) 。所提供的内容似乎并非完整且正确的代码语句表述, 存在一些不明确和错误的地方, 难以按照要求准确改写。请提供完整、准确的内容以便能进行有效改写。流程是将原wen件操作进行更改: 首先, 把原wen件以读这种模式去打开其次, 要创建一个新wen件通过写该模式。3, 把原文件那里边的内容给读出来, 然后修改成为新的内容, 写完之后写到那个新文件里头。4, 把原文件给删除了。5, 把新文件重新给命名成原文件的名字。 # 修改后的内容。涉及文件操作更改的流程, 其一, 是以读的模式去打开原本的文件。其二, 是以写的模式去创建一个全新的文件。其三, 将原本文件之中的内容读取出来, 把它修改成为新的内容并且写入这个新文件。其四, 把原本的文件进行删除。