C# 文件系统I/O操作--File类与FileInfo类

server/2024/12/25 21:20:25/

FileFileInfo两个功能基本相同,他们都是基于System.IO命名空间的文件操作类。File 和 FileInfo 都是 .NET 基于System.IO命名空间中用于处理文件的类,但它们的设计理念和使用方式有所不同:

  • File静态类,它不属于特定对象,所以不能被实例化,如果只是对文件单一、少量的操作,如判断文件是否存在,建议使用File类。
  • FileInfo需要实例化对象后才可以调用相关方法。它对应某一个文件进行重复操作,如果是对一个文件进行大量的操作,建议使用FileInfo类。

一.File类

File 类是 文件操作的重要类。提供了许多静态方法,可以方便地进行文件和目录的创建、删除、复制、移动、打开单一文件等操作
并协助创建 FileStream 对象。

File是静态类,它不属于特定对象,所以不能被实例化,只能通过File.方法名调用其方法。

  • 创建文件:
    File.Create(string path):创建或覆盖指定路径的文件
    File.CreateText(string path) :创建或打开用于写入 UTF-8 编码文本的文件。 如果该文件已存在,将覆盖其内容。
    File.WriteAllText(string path, string contents):创建或覆盖指定路径的文件,并将字符串写入文件。
    File.WriteAllLines(string path, IEnumerable<string> contents):创建或覆盖指定路径的文件并将字符串集合写入文件
    File.AppendText(string path):创建一个 StreamWriter 对象,该对象可以向指定路径的文件追加文本。
    File.AppendAllLines(string path, IEnumerable contents):将字符串集合追加到指定路径的文件中,每个字符串占一行。换行
    File.AppendAllText(string path, string contents):将指定的字符串追加到指定路径的文件中。不换行
  • 读取文件:
    File.ReadAllText(string path):读取指定路径文件的所有文本内容
    File.ReadAllLines(string path):读取指定路径文件的所有文本内容,按照一行行读取,返回字符串数组
    File.ReadAllBytes(string path):读取指定路径文件的所有字节内容,并返回一个字节数组。
  • 删除文件:
    File.Delete(string path):删除指定路径的文件。
  • 复制文件:
    File.Copy(string sourceFileName, string destFileName, bool overwrite):将指定源文件复制到目标位置
  • 移动文件:
    File.Move(string sourceFileName, string destFileName):将指定源文件移动到目标位置。
  • 检查文件是否存在:
    File.Exists(string path):检查指定路径的文件是否存在。(常配合Directory类使用)

1.文件操作判断相关方法

File.Exists(String)

File.Exists(String):确定指定的文件是否存在。返回True/False

using System;
using System.IO;class Program
{static void Main(){try{string sourcePath = "source.txt";string destinationPath = "destination.txt";// 检查文件是否存在if (File.Exists(sourcePath)){Console.WriteLine("源文件存在。");}else{Console.WriteLine("源文件不存在。");}}catch (IOException ex){Console.WriteLine($"IO 错误: {ex.Message}");}catch (UnauthorizedAccessException ex){Console.WriteLine($"无权限访问文件: {ex.Message}");}catch (Exception ex){Console.WriteLine($"发生错误: {ex.Message}");}}
}

2. 创建并写入文本文件、追加文本

CreateText

File.CreateText(string path):创建或打开用于写入 UTF-8 编码文本的文件。 如果该文件已存在,将覆盖其内容。

using System;
using System.IO;
class Test
{public static void Main(){string path = "example.txt";if (!File.Exists(path)){// 创建一个要写入的文件。using (StreamWriter sw = File.CreateText(path)){sw.WriteLine("Hello");sw.WriteLine("And");sw.WriteLine("Welcome");}}}
}

WriteAllText

File.WriteAllText(string path, string contents):创建或覆盖指定路径的文件,并将字符串写入文件。

using System;
using System.IO;class Program
{static void Main(){string filePath = "example.txt";string textToWrite = "Hello, World!";// 创建文件并写入文本File.WriteAllText(filePath, textToWrite);Console.WriteLine("文件已创建并写入文本。");File.AppendAllText(filePath ,$"追加文本内容1{DateTime.Now}");//不会换行}
}

说明:
• 使用 File.WriteAllText 方法创建文件并写入文本内容。
• 如果文件已存在,则会被覆盖。

AppendText

File.AppendText(string path):创建一个 StreamWriter 对象,该对象可以向指定路径的文件追加文本。

using System;
using System.IO;class Program
{static void Main(){using (StreamWriter writer = File.AppendText("example.txt")){writer.WriteLine("Hello, World!");writer.WriteLine("This is a new line.");}Console.WriteLine("文本已追加到文件中。");}
}

结果:

Hello, World!
This is a new line.

说明:
• 使用 File.AppendText 方法创建一个 StreamWriter 对象,该对象可以向文件追加文本。
• 使用 StreamWriter 的 WriteLine 方法逐行追加文本。自动换行
• using 语句确保 StreamWriter 在使用完毕后正确释放资源。

AppendAllText

File.AppendAllText(string path, string contents)追加单行文本

using System;
using System.IO;class Program
{static void Main(){File.AppendAllText("example.txt", "Hello, World!\n");Console.WriteLine("文本已追加到文件中。");}
}

结果:

Hello, World!

说明:
• 使用 File.AppendAllText 方法将指定的字符串追加到文件中。 不换行
• 如果文件不存在,则会创建新文件。

AppendAllLines

File.AppendAllLines(string path, IEnumerable contents)追加多行文本

using System;
using System.IO;class Program
{static void Main(){string[] lines = { "Line 1", "Line 2", "Line 3" };File.AppendAllLines("example.txt", lines);Console.WriteLine("行已追加到文件中。");}
}

结果:

Line 1
Line 2
Line 3

3.读取文本文件内容

ReadAllText

File.ReadAllText(string path):读取指定路径文件的所有文本内容

using System;
using System.IO;class Program
{static void Main(){string filePath = "example.txt";// 检查文件是否存在if (File.Exists(filePath)){// 读取文件内容string content = File.ReadAllText(filePath);Console.WriteLine(content);}else{Console.WriteLine("文件不存在。");}}
}

结果:

Line 1Line 2Line 3

说明:

• 使用 File.Exists 方法检查文件是否存在。
• 使用 File.ReadAllText 方法读取文件内容并打印到控制台。

ReadAllLines

File.ReadAllLines(string path):读取指定路径文件的所有文本内容,按照一行行读取,返回字符串数组

using System;
using System.IO;class Program
{static void Main(){string[] lines = File.ReadAllLines("example.txt");foreach (string line in lines){Console.WriteLine(line);}}
}

结果:

Line 1
Line 2
Line 3

说明:

• 使用 File.ReadAllLines方法读取指定路径文件的所有文本内容,并返回一个字符串数组,每个元素对应文件中的一行。
• 如果文件不存在,会抛出FileNotFoundException。

ReadAllBytes

File.ReadAllBytes(string path):读取指定路径文件的所有字节内容,并返回一个字节数组。

using System;
using System.IO;class Program
{static void Main(){byte[] bytes = File.ReadAllBytes("example.bin");Console.WriteLine($"文件大小: {bytes.Length} 字节");}
}

结果:

文件大小: 1024 字节

说明:

• 使用 File.ReadAllBytes 方法读取指定路径文件的所有字节内容,并返回一个字节数组。
• 如果文件不存在,会抛出FileNotFoundException。

4. 复制文件

Copy

File.Copy(string sourceFileName, string destFileName, bool overwrite):将指定源文件复制到目标位置

using System;
using System.IO;class Program
{static void Main(){string sourceFilePath = "example.txt";string destinationFilePath = "copy_example.txt";// 检查源文件是否存在if (File.Exists(sourceFilePath)){// 复制文件File.Copy(sourceFilePath, destinationFilePath, true);Console.WriteLine("文件已复制。");}else{Console.WriteLine("源文件不存在。");}}
}

说明:

• 使用 File.Exists 方法检查源文件是否存在。
• 使用 File.Copy 方法复制文件,第三个参数 true 表示如果目标文件已存在则覆盖。

5. 移动文件

Move

File.Move(string sourceFileName, string destFileName):将指定源文件移动到目标位置。

using System;
using System.IO;class Program
{static void Main(){string sourceFilePath = "example.txt";string destinationFilePath = "moved_example.txt";// 检查源文件是否存在if (File.Exists(sourceFilePath)){// 移动文件File.Move(sourceFilePath, destinationFilePath);Console.WriteLine("文件已移动。");}else{Console.WriteLine("源文件不存在。");}}
}

说明:

• 使用 File.Exists 方法检查源文件是否存在。
• 使用 File.Move 方法将文件从源路径移动到目标路径。

6. 删除文件

Delete

File.Delete(string path):删除指定路径的文件。

using System;
using System.IO;class Program
{static void Main(){string filePath = "example.txt";// 检查文件是否存在if (File.Exists(filePath)){// 删除文件File.Delete(filePath);Console.WriteLine("文件已删除。");}else{Console.WriteLine("文件不存在。");}}
}

说明:

• 使用 File.Exists 方法检查文件是否存在。
• 使用 File.Delete 方法删除文件。

二. FileInfo类

FileInfo提供用于创建、复制、删除、移动和打开文件的属性和实例方法,并且帮助创建 FileStream 对象。 此类不能被继承。如果要对同一文件执行多个操作,则使用 FileInfo实例方法(而不是类的相应静态方法 File)可能更高效,因为安全检查并不总是必要的。

FileInfo常用属性

  1. Name:获取文件的名称,包括扩展名。
  2. FullName: 获取文件的完整路径。
  3. DirectoryName:获取文件所在的目录的完整路径。
  4. Exists: 获取指示文件是否存在的布尔值。
  5. Length: 获取文件的大小(字节)。返回值:一个长整型数值,表示文件的大小(字节)。
  6. CreationTime: 获取或设置文件的创建日期和时间。返回值:一个 DateTime 对象,表示文件的创建日期和时间。
  7. LastWriteTime: 获取或设置文件上次写入的时间。返回值:一个 DateTime 对象,表示文件上次写入的时间。
  8. LastAccessTime: 获取或设置文件上次访问的时间。返回值:一个 DateTime 对象,表示文件上次访问的时间。
using System;
using System.IO;class Program
{static void Main(){try{FileInfo fileInfo = new FileInfo("example.txt");if (fileInfo.Exists){Console.WriteLine($"文件名: {fileInfo.Name}");Console.WriteLine($"完整路径: {fileInfo.FullName}");Console.WriteLine($"所在目录: {fileInfo.DirectoryName}");Console.WriteLine($"文件大小: {fileInfo.Length} 字节");Console.WriteLine($"创建时间: {fileInfo.CreationTime}");Console.WriteLine($"最后写入时间: {fileInfo.LastWriteTime}");Console.WriteLine($"最后访问时间: {fileInfo.LastAccessTime}");}else{Console.WriteLine("文件不存在。");}}catch (FileNotFoundException ex){Console.WriteLine($"文件未找到: {ex.Message}");}catch (Exception ex){Console.WriteLine($"发生错误: {ex.Message}");}}
}

结果:

文件名: example.txt
完整路径: C:\path\to\your\project\example.txt
所在目录: C:\path\to\your\project
文件大小: 1024 字节
创建时间: 2023/10/01 12:34:56
最后写入时间: 2023/10/02 09:12:34
最后访问时间: 2023/10/02 09:12:34

说明:

• 创建一个 FileInfo 对象并检查文件是否存在。
• 如果文件存在,则输出文件的各种属性。
• 处理可能的异常,如FileNotFoundException。

FileInfo常用方法

  1. CopyTo(string destFileName) 将现有文件复制到新位置,不允许覆盖同名文件。
    • 参数:
    • destFileName:目标文件路径。
    • 返回值:一个新的 FileInfo 对象,表示目标文件。
  2. MoveTo(string destFileName) 将文件移动到新位置。
    • 参数:
    • destFileName:目标文件路径。
  3. Delete() 删除文件。
  4. OpenRead() 打开文件以进行读取。
    • 返回值:一个 FileStream 对象,表示打开的文件。
  5. OpenWrite() 打开文件以进行写入。
    • 返回值:一个 FileStream 对象,表示打开的文件。
  6. CreateText() 创建一个 StreamWriter 对象,用于向文件写入字符。
    • 返回值:一个 StreamWriter 对象,表示创建的流写入器。
  7. AppendText() 创建一个 StreamWriter 对象,用于向文件追加字符。
    • 返回值:一个 StreamWriter 对象,表示创建的流写入器。

1.判断文件是否存在

Exists()

using System;
using System.IO;class Program
{static void Main(){try{string sourcePath = "source.txt";string destinationPath = "destination.txt";// 创建 FileInfo 对象FileInfo sourceFile = new FileInfo(sourcePath);if (sourceFile.Exists){Console.WriteLine("源文件存在。");}else{Console.WriteLine("源文件不存在。");}}catch (IOException ex){Console.WriteLine($"IO 错误: {ex.Message}");}catch (UnauthorizedAccessException ex){Console.WriteLine($"无权限访问文件: {ex.Message}");}catch (Exception ex){Console.WriteLine($"发生错误: {ex.Message}");}}
}

2. 创建并写入文本文件、追加文本

CreateText()

CreateText():创建一个 StreamWriter 对象,用于向文件写入字符。

using System;
using System.IO;class Program
{static void Main(){try{FileInfo fileInfo = new FileInfo("example.txt");using (StreamWriter writer = fileInfo.CreateText()){writer.WriteLine("Hello, World!");Console.WriteLine("文本已写入文件。");}}catch (IOException ex){Console.WriteLine($"IO 错误: {ex.Message}");}catch (UnauthorizedAccessException ex){Console.WriteLine($"无权限访问文件: {ex.Message}");}catch (Exception ex){Console.WriteLine($"发生错误: {ex.Message}");}}
}

结果:

文本已写入文件。

说明:

• 创建一个 StreamWriter 对象,用于向 example.txt 文件写入字符。
• 写入字符串 “Hello,World!” 到文件中。
• 处理可能的异常,如 IOException 和 UnauthorizedAccessException。

OpenWrite()

OpenWrite()打开文件以进行写入。
返回值:一个 FileStream 对象,表示打开的文件。

using System;
using System.IO;class Program
{static void Main(){try{FileInfo fileInfo = new FileInfo("example.txt");if (fileInfo.Exists){using (FileStream fs = fileInfo.OpenWrite()){byte[] data = System.Text.Encoding.UTF8.GetBytes("Hello, World!");fs.Write(data, 0, data.Length);Console.WriteLine("数据已写入文件。");}}else{Console.WriteLine("文件不存在。");}}catch (IOException ex){Console.WriteLine($"IO 错误: {ex.Message}");}catch (UnauthorizedAccessException ex){Console.WriteLine($"无权限访问文件: {ex.Message}");}catch (Exception ex){Console.WriteLine($"发生错误: {ex.Message}");}}
}

说明:

• 打开 example.txt 文件以进行写入。
• 写入字符串 “Hello, World!” 到文件中。
• 处理可能的异常,如IOException 和 UnauthorizedAccessException。

结果:

数据已写入文件。

AppendText()

AppendText():创建一个 StreamWriter 对象,用于向文件追加字符。

using System;
using System.IO;class Program
{static void Main(){try{FileInfo fileInfo = new FileInfo("example.txt");using (StreamWriter writer = fileInfo.AppendText()){writer.WriteLine("这是追加的文本。");Console.WriteLine("文本已追加到文件。");}}catch (IOException ex){Console.WriteLine($"IO 错误: {ex.Message}");}catch (UnauthorizedAccessException ex){Console.WriteLine($"无权限访问文件: {ex.Message}");}catch (Exception ex){Console.WriteLine($"发生错误: {ex.Message}");}}
}

说明:

• 创建一个 StreamWriter 对象,用于向 example.txt 文件追加字符。
• 追加字符串 “这是追加的文本。” 到文件中。
• 处理可能的异常,如 IOException 和 UnauthorizedAccessException。

结果:

文本已追加到文件。

3.读取文本文件内容

OpenRead()

OpenRead()打开文件以进行读取。
返回值:一个 FileStream 对象,表示打开的文件。

using System;
using System.IO;class Program
{static void Main(){try{FileInfo fileInfo = new FileInfo("example.txt");if (fileInfo.Exists){using (FileStream fs = fileInfo.OpenRead()){byte[] buffer = new byte[fs.Length];int bytesRead = fs.Read(buffer, 0, buffer.Length);Console.WriteLine($"读取了 {bytesRead} 字节的数据。");}}else{Console.WriteLine("文件不存在。");}}catch (IOException ex){Console.WriteLine($"IO 错误: {ex.Message}");}catch (UnauthorizedAccessException ex){Console.WriteLine($"无权限访问文件: {ex.Message}");}catch (Exception ex){Console.WriteLine($"发生错误: {ex.Message}");}}
}

说明:

• 打开 example.txt 文件以进行读取。
• 读取文件内容并输出读取的字节数。
• 处理可能的异常,如 IOException 和 UnauthorizedAccessException。

结果:

读取了 1024 字节的数据。

4. 复制文件

CopyTo(string destFileName)

CopyTo(string destFileName)将现有文件复制到新位置,不允许覆盖同名文件。
参数:
• destFileName:目标文件路径。
• 返回值:一个新的 FileInfo 对象,表示目标文件

using System;
using System.IO;class Program
{static void Main(){try{FileInfo sourceFile = new FileInfo("source.txt");string destinationPath = "destination.txt";if (sourceFile.Exists){FileInfo copiedFile = sourceFile.CopyTo(destinationPath, false); // 不允许覆盖Console.WriteLine($"文件已复制到: {copiedFile.FullName}");}else{Console.WriteLine("源文件不存在。");}}catch (IOException ex){Console.WriteLine($"IO 错误: {ex.Message}");}catch (UnauthorizedAccessException ex){Console.WriteLine($"无权限访问文件: {ex.Message}");}catch (Exception ex){Console.WriteLine($"发生错误: {ex.Message}");}}
}

说明:

• 将 source.txt 文件复制到 destination.txt。
• 不允许覆盖同名文件。
• 处理可能的异常,如IOException 和 UnauthorizedAccessException。

结果:

文件已复制到: C:\path\to\your\project\destination.txt

5. 移动文件

MoveTo(string destFileName)

MoveTo(string destFileName)将文件移动到新位置。
参数:
• destFileName:目标文件路径。

using System;
using System.IO;class Program
{static void Main(){try{FileInfo sourceFile = new FileInfo("source.txt");string destinationPath = "movedSource.txt";if (sourceFile.Exists){sourceFile.MoveTo(destinationPath);Console.WriteLine($"文件已移动到: {destinationPath}");}else{Console.WriteLine("源文件不存在。");}}catch (IOException ex){Console.WriteLine($"IO 错误: {ex.Message}");}catch (UnauthorizedAccessException ex){Console.WriteLine($"无权限访问文件: {ex.Message}");}catch (Exception ex){Console.WriteLine($"发生错误: {ex.Message}");}}
}

说明:

• 将 source.txt 文件移动到 movedSource.txt。
• 处理可能的异常,如 IOException 和 UnauthorizedAccessException。

结果:

文件已移动到: movedSource.txt

6. 删除文件

Delete()

Delete()删除文件。

using System;
using System.IO;class Program
{static void Main(){try{FileInfo fileToDelete = new FileInfo("example.txt");if (fileToDelete.Exists){fileToDelete.Delete();Console.WriteLine("文件已删除。");}else{Console.WriteLine("文件不存在。");}}catch (IOException ex){Console.WriteLine($"IO 错误: {ex.Message}");}catch (UnauthorizedAccessException ex){Console.WriteLine($"无权限访问文件: {ex.Message}");}catch (Exception ex){Console.WriteLine($"发生错误: {ex.Message}");}}
}

说明:

• 删除 example.txt 文件。
• 处理可能的异常,如 IOException 和 UnauthorizedAccessException。

结果:

文件已删除。

三. File 类与FileInfo 类优缺点对比

File 类的优点和缺点

优点

  1. 简单易用:
    • 提供静态方法,可以直接调用,无需实例化对象。
    • 对于简单的文件操作非常方便快捷。
  2. 性能较好:
    • 因为是静态方法,避免了对象创建的开销,对于大量文件操作可能更高效。
  3. 适用于一次性操作:
    • 当只需要进行一次性的文件操作(如复制、删除)时,使用 File 类更为简洁。

缺点

  1. 缺乏状态管理:
    • 没有状态管理机制,每次操作都需要指定完整的文件路径。
    • 不适合需要多次操作同一文件的情况。
  2. 代码可读性较差:
    • 对于复杂的文件操作逻辑,使用静态方法可能导致代码难以阅读和维护。
  3. 灵活性有限:
    • 功能相对固定,无法像 FileInfo 类那样灵活地扩展和自定义行为。

FileInfo 类优点和缺点

优点

  1. 面向对象设计:
    • 代表具体的文件对象,提供了丰富的属性和方法,便于管理和操作文件。
    • 可以存储文件的状态信息,适合多次操作同一个文件的情况。
  2. 易于维护:
    • 使用对象的方式组织代码,结构清晰,便于维护和扩展。
    • 可以轻松地管理多个文件对象,而不需要重复调用静态方法。
  3. 支持更多的功能:
    • 提供了许多高级功能,如文件的创建时间、修改时间、长度等属性。
    • 支持打开文件流进行读写操作,灵活性更高。

缺点

  1. 对象创建开销:
    • 需要创建 FileInfo 对象,可能会带来一定的内存和性能开销。
    • 在需要频繁创建和销毁文件对象的情况下,可能不如 File 类高效。
  2. 复杂度增加:
    • 面向对象的设计增加了代码的复杂性,对于简单的文件操作显得有些繁琐。
    • 新手可能需要更多的时间来理解和使用 FileInfo 类。
  3. 不适合一次性操作:
    • 对于只需要进行一次性的文件操作(如复制、删除),使用 FileInfo 类会显得冗余。

四. 总结

• File 类:适用于简单的、一次性文件操作,代码简洁,性能较好。如:
• FileInfo 类:适用于需要多次操作同一文件或需要访问文件详细信息的情况,代码更具结构性和可维护性更高。


http://www.ppmy.cn/server/152852.html

相关文章

Mac系统下 idea中如何创建maven项目

首先点击顶部的File&#xff0c;然后将鼠标移至New&#xff0c;会显示Project&#xff0c;点击Project&#xff0c;如下图所示。 然后选择Empty Project&#xff0c;填写项目名称&#xff0c;选择项目存放地址&#xff0c;点击Create&#xff0c;完成空项目的创建&#xff0c;…

CSS的样式计算过程

先看一段代码&#xff0c; a标签是什么颜色&#xff1f; <html><head><title>CSS</title><style>.wrapper {color: red;}</style></head><body><div class"wrapper"><a href"#">我是一个a标…

【漏洞-Oracle】未设置口令复杂度校验、密码有效期

1.场景描述 三方漏洞扫描&#xff1a; 2.详细描述 安全问题&#xff1a;Oracle未设置系统的口令复杂度校验、密码有效期。 危害分析结果&#xff1a;存在使用口令被恶意用户猜测获得&#xff0c;合法用户身份被仿冒&#xff0c;导致系统被非授权访问的可能性。 整改建议&…

41.在Vue3中使用OpenLayers实现读取WKT数据,输出GML、Polyline、GeoJSON

引言 随着地理信息系统&#xff08;GIS&#xff09;应用的不断发展&#xff0c;Web地图和地理数据的处理已经成为许多前端开发者的重要任务之一。在Vue 3框架中结合OpenLayers进行地理数据的可视化展示是一种常见的解决方案。OpenLayers是一个开源的Web地图API&#xff0c;支持…

在Visual Studio 2022中配置C++计算机视觉库Opencv

本文主要介绍下载OpenCV库以及在Visual Studio 2022中配置、编译C计算机视觉库OpenCv的方法 1.Opencv库安装 ​ 首先&#xff0c;我们需要安装OpenCV库&#xff0c;作为一个开源库&#xff0c;我们可以直接在其官网下载Releases - OpenCV&#xff0c;如果官网下载过慢&#x…

Python 标准库:string——字符串操作

文章目录 模块介绍主要常量主要类- Formatter- Template 主要函数- capwords()- Template.substitute()- Formatter.format() 模块介绍 string 模块提供了许多与字符串操作相关的常量和函数。它主要用于处理字符串&#xff0c;包括字符集合、格式化操作和其他与字符串相关的功…

【Nginx-4】Nginx负载均衡策略详解

在现代Web应用中&#xff0c;随着用户访问量的增加&#xff0c;单台服务器往往难以承受巨大的流量压力。为了解决这一问题&#xff0c;负载均衡技术应运而生。Nginx作为一款高性能的Web服务器和反向代理服务器&#xff0c;提供了多种负载均衡策略&#xff0c;能够有效地将请求分…

Django连接mysql数据库报错ModuleNotFoundError: No module named ‘MySQLdb‘

是不是很诧异明明pymysql库也安装了&#xff0c;setting.py文件也配置好了为啥报错 因为选择使用pymysql&#xff0c;还需要在 Django 项目的设置中添加以下代码&#xff0c;让 Django 使用 pymysql作为 MySQL 数据库适配器&#xff1a; import pymysqlpymysql.install_as_My…