首页 > 其他分享 >第九章学习笔记

第九章学习笔记

时间:2023-09-17 11:11:35浏览次数:28  
标签:文件 读取 第九章 写入 笔记 学习 用于 file path

Unix/Linux系统编程学习笔记第九章

知识点归纳以及最有收获的内容

  • I/O库函数知识点总结

1. 文件操作

  • open()函数:用于打开文件,可以指定文件名、模式(读取、写入、追加等)以及编码。
  • 文件模式(mode):包括读取模式('r')、写入模式('w')、追加模式('a')、二进制模式('b')等。
  • close()函数:用于关闭已打开的文件,释放资源。
  • with语句:可以自动管理文件的打开和关闭,减少资源泄漏的风险。

2. 读取文件内容

  • read()方法:用于读取整个文件的内容,可以指定读取的字符数。
  • readline()方法:用于逐行读取文件内容。
  • readlines()方法:将文件内容按行读取到列表中。
  • for循环:可以用于逐行遍历文件内容。

3. 写入文件内容

  • write()方法:用于向文件中写入数据,可以是字符串或二进制数据。
  • writelines()方法:将字符串列表写入文件。
  • seek()方法:用于移动文件指针到指定位置,以实现随机写入。

4. 文件迭代

  • for循环:可以用于逐行迭代文件内容,特别适用于大文件。

5. 文件对象属性

  • name属性:表示文件的名称。
  • mode属性:表示文件的打开模式。
  • closed属性:表示文件是否已关闭。

6. 异常处理

  • try...except语句:用于捕获文件操作可能引发的异常,如文件不存在、权限问题等。

7. 目录操作

  • os模块:提供了一系列用于处理文件和目录的函数,如创建目录、删除目录、列出目录内容等。

8. 标准输入和标准输出

  • sys.stdin:标准输入流对象,用于从键盘读取用户输入。
  • sys.stdout:标准输出流对象,用于向屏幕输出内容。
  • sys.stderr:标准错误流对象,用于输出错误信息。

9. 二进制文件操作

  • 二进制模式('b'):可以用于处理图像、音频等二进制文件。
  • rb和wb模式:分别用于读取和写入二进制文件。

10. 缓冲区

  • 缓冲区:用于临时存储数据,以提高I/O性能。
  • buffered属性:文件对象的属性,用于检查文件是否使用了缓冲区。

11. 文件的位置和指针

  • tell()方法:用于获取文件指针的当前位置。
  • seek()方法:用于移动文件指针到指定位置。

12. 文本编码和字符集

  • 文本编码:表示文件中字符的编码方式,如UTF-8、ISO-8859-1等。
  • encoding属性:用于获取文件的编码。
  • open()函数的encoding参数:用于指定文件的编码。

13. 文件模式附加选项

  • +号:可以与文件模式一起使用,用于支持读写模式,如'r+'和'w+'。

14. 文件的复制和移动

  • shutil模块:提供了用于复制和移动文件的函数,如shutil.copy()和shutil.move()。

苏格拉底挑战





问题与解决思路

当进行I/O文件读写时,常见的问题包括文件不存在、权限问题、编码错误、内存消耗过大等。

  • 总结如下

文件不存在问题:

  • 问题描述: 尝试打开或读取一个不存在的文件,导致FileNotFoundError。
  • 解决方式:
    在打开文件前,确保文件存在,可以使用os.path.exists()来检查。
    使用try...except块来捕获FileNotFoundError并进行适当的错误处理
import os

file_path = "example.txt"

if os.path.exists(file_path):
    with open(file_path, 'r') as file:
        content = file.read()
else:
    print(f"File '{file_path}' does not exist.")

权限问题:

  • 问题描述: 尝试读取或写入一个没有权限的文件,导致PermissionError。
  • 解决方式:
    确保你具有足够的权限来访问文件。
    如果是在Linux或类Unix系统上,可以使用chmod命令更改文件的权限。
    在Windows上,确保文件没有被其他程序锁定。

编码错误:

  • 问题描述: 尝试使用错误的编码方式读取文本文件,导致UnicodeDecodeError或乱码。
  • 解决方式:
    使用正确的编码方式打开文件,通常是UTF-8。
    在打开文件时,指定正确的编码方式,如open('file.txt', 'r', encoding='utf-8')。
    使用异常处理来处理编码错误,例如将错误字符替换为占位符。
try:
    with open('file.txt', 'r', encoding='utf-8') as file:
        content = file.read()
except UnicodeDecodeError:
    print("Encoding error: Unable to decode file.")

内存消耗过大:

  • 问题描述: 尝试一次性读取大文件的全部内容,导致内存消耗过大,可能引发MemoryError。
  • 解决方式:
    逐行或逐块读取文件,以减少内存消耗。
    使用生成器(Generator)来处理大文件,以节省内存。
def read_large_file(file_path):
    with open(file_path, 'r') as file:
        for line in file:
            yield line

实践过程

创建并写入文件:

#include <stdio.h>

int main() {
    // 创建文件并打开以写入模式
    FILE *file = fopen("example.txt", "w");

    // 检查文件是否成功打开
    if (file == NULL) {
        perror("Error opening file");
        return 1;
    }

    // 写入数据到文件
    fprintf(file, "Hello, world!\n");
    fprintf(file, "This is a C programming example.\n");
    printf("已经成功写入");
    // 关闭文件
    fclose(file);

    return 0;
}


读取文件内容:

#include <stdio.h>
int main() {
    // 打开文件以读取模式
    FILE *file = fopen("example.txt", "r");

    // 检查文件是否成功打开
    if (file == NULL) {
        perror("Error opening file");
        return 1;
    }

    // 读取文件内容并打印
    char buffer[100]; // 缓冲区
    while (fgets(buffer, sizeof(buffer), file) != NULL) {
        printf("%s", buffer);
    }

    // 关闭文件
    fclose(file);

    return 0;
}

3. 追加内容到文件:

#include <stdio.h>

int main() {
    // 打开文件以追加模式
    FILE *file = fopen("example.txt", "a");

    // 检查文件是否成功打开
    if (file == NULL) {
        perror("Error opening file");
        return 1;
    }

    // 写入数据到文件
    fprintf(file, "This line is appended.\n");

    // 关闭文件
    fclose(file);

    return 0;
}


标签:文件,读取,第九章,写入,笔记,学习,用于,file,path
From: https://www.cnblogs.com/wujiuchun/p/17707925.html

相关文章

  • FastAPI学习-20.response 参数-设置响应头部
    前言你可以在你的_路径操作函数_中声明一个Response类型的参数。设置响应头部你可以在这个_临时_响应对象中设置头部fromfastapiimportFastAPI,Responseapp=FastAPI()@app.get("/headers-and-object/")defget_headers(response:Response):response.headers......
  • 学习Mybatis-Plus的记录
    目录1.常用注解2.条件查询2.1.各种方式的查询2.2.AllEq用法2.3selectOne方法2.4lambda条件构造器2.5select不查出所有的字段2.6通用Mapper2.7自定义sql3.分页查询4.更新5.AR(ActiveRecord)模式6.主键策略7.Mp的配置1.常用注解@TableName用于在数据库表名和实体对......
  • 第一周阅读笔记|人月神话
    阅读了前两章一个软件的实现,不仅仅是代码的完成,只是程序的完成还远远不够,更多的需要程序变成编程产品,这是可以被任何人运行、测试、修复和扩展的程序,它可以运行在多种操作系统平台上;同时程序还要变成编程系统,可以进行交互,并可以用来组装和搭建整个系统。最后成为编程系统产品,才是......
  • 《动手学深度学习 Pytorch版》 6.7 填充和步幅
    6.3.1填充虽然我们用的卷积核较小,每次只会丢失几像素,但是如果应用多层连续的卷积层,累积的像素丢失就会很多。解决此问题的方法为填充。填充后的输出形状将为\((n_h-k_h+p_h+1)\times(n_w-k_w+p_w+1)\)importtorchfromtorchimportnndefcomp_conv2d(conv2d,X):X......
  • 学习笔记2
    ##I/O库函数-系统调用是文件操作的基础,但是它们只支持数据块的读/写。**I/O库函数和系统调用**-在Unix/Linux中,I/O库函数建立在系统调用的基础上。-相互关系系统调用函数:open()、read()、write()、lseek()、close();I/O库函数:fopen()、fread()、fwrit......
  • 梅科尔工作室-IoT-南向开发第五次培训笔记
    ADCAPI分析unsignedintIoTAdcRead(unsignedintchannel,unsignedshort*data,IotAdcEquModelSelequModel,IotAdcCurBaiscurBais,unsignedshortrstCnt);参数说明channel:表示ADC通道data:表示指向存储读取数据的地址的指针equModel:表示平均算法的次数......
  • openGauss学习笔记-71 openGauss 数据库管理-创建和管理普通表-删除表中数据
    openGauss学习笔记-71openGauss数据库管理-创建和管理普通表-删除表中数据在使用表的过程中,可能会需要删除已过期的数据,删除数据必须从表中整行的删除。SQL不能直接访问独立的行,只能通过声明被删除行匹配的条件进行。如果表中有一个主键,用户可以指定准确的行。用户可以删除匹配......
  • 学习常见的反爬虫手段,如验证码、限制访问频率等
    验证码(CAPTCHA):用于识别机器人和自动化程序,可以通过以下方式实现:fromPILimportImageimportpytesseract#读取验证码图片image=Image.open('captcha.png')#使用pytesseract库进行验证码识别text=pytesseract.image_to_string(image)print(text)IP限制/访问频......
  • C++ 学习笔记、01 | 开发简单职工管理系统遇到的一些问题
    记录开发简单职工管理系统遇到的一些问题,黑马教程https://www.bilibili.com/video/BV1et411b73ZP147~P166头文件与源文件头文件只声明,源文件来实现(本质上是类内声明类外实现)源文件需要引用特定的头文件ifndefOOPFINAL_WORKER_H#defineOOPFINAL_WORKER_H#include<......
  • 算法学习笔记(mkdir
    算法学习笔记数据结构图论树上问题欧拉序图上问题kruskal重构树数论数论分块......