python学习笔记之编写readConfig读写配置文件

本文介绍了Python中ConfigParser模块的使用,包括读取配置文件、获取section、option、值的方法,以及如何添加section和设置键值对,提供了一系列操作示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天分享下关于python读取配置文件的相关知识点,这里主要介绍python的ConfigParser模块的用法。话不多说,下面直接上代码讲解。

首先我们要知道配置文件中的格式要求是什么?说起来也很简单,直接看看下面的示例吧:

[Group1]
name=name1
age=20
tel=1385****698
address=nanjing

[group2]
name=name2
age=18
tel=1864****895
address=beijing

从上面我们可以看的很清楚,其实说的容易懂写,就类似于,在这个配置文件里,你可以分类来组织自己的内容,例如group1,group2等等,名称可以自己命名,然后在每个分组下,用“key=value”的形式,把需要的内容填写进去。很简单吧。

既然配置文件准备完毕了,接下来我们就要对它进行读写操作了,毕竟这才是我们最需要的嘛,文件写起来不难,那怎么让我们在自己的代码中能够轻松的对它进行读取和写入呢?我们继续往下看。

在这里,我们引入了python的configparser模块,通过它,我们来对写好的文件内容进行操作。

首先,看一下configparser模块的常用方法有哪些:

--read():读取配置文件

--sections():读取配置文件中所有的section(可以理解为组名:group1,group2……)

--options(section):读取该section下所有的option(可以理解成读取该组下的所有key)

--items(section):读取该section下的所有值,并以键值对形式输出(例如:(‘name’:‘name1’))

--get(section, option):读取指定section下面的option的值(可以理解成,读取具体某个group下面指定key的值)

--add_section(section):添加一个section,参数为section的名称

--set(section, option, value):在section下面添加一条数据(key=value),需要调用write()将内容写入文件

以上面的文件为例,来看下具体的操作:

read()

sections()

options()

items()

get()

add_section()

set()

以上就是各个方法的使用示例,在平时工作中,我们只要灵活运用,就可以轻松应对啦,希望大家能跟我一样,多多学习,从简单做起,以后的路还长着呢,加油吧!

注:欢迎大家评论,转载,转载时请说明出处,谢谢啦。

 

转载于:https://my.oschina.net/u/3041656/blog/829307

package com.hexiang.utils; import java.io.File; import java.io.FileInputStream; import java.util.Properties; public class ReadConfigation{ /** * 属性文件全名 */ private static final String PFILE ="Config.properties"; /** * 对应于属性文件的文件对象变量 */ private File m_file = null; /** * 属性文件的最后修改日期 */ private long m_lastModifiedTime = 0; /** * 属性文件所对应的属性对象变量 */ private Properties m_props = null; /** * 本类可能存在的惟一的一个实例 */ private static ReadConfigation m_instance =new ReadConfigation(); /** * 私有的构造子,用以保证外界无法直接实例化 */ private ReadConfigation() { m_file = new File(PFILE); m_lastModifiedTime = m_file.lastModified(); if(m_lastModifiedTime == 0){ System.err.println(PFILE +" file does not exist!"); } m_props = new Properties(); try { m_props.load(new FileInputStream(PFILE)); } catch(Exception e) { e.printStackTrace(); } } /** * 静态工厂方法 * @return 返还ReadConfigation 类的单一实例 */ synchronized public static ReadConfigation getInstance() { return m_instance; } /** * 读取一特定的属性项 * * @param name 属性项的项名 * @param defaultVal 属性项的默认值 * @return 属性项的值(如此项存在), 默认值(如此项不存在) */ public String getConfigItem(String name,String defaultVal) { long newTime = m_file.lastModified(); // 检查属性文件是否被其他程序 // 如果是,重新读取此文件 if(newTime == 0) { // 属性文件不存在 if(m_lastModifiedTime == 0){ System.err.println(PFILE+ " file does not exist!"); }else{ System.err.println(PFILE+ " file was deleted!!"); } return defaultVal; }else if(newTime > m_lastModifiedTime){ // Get rid of the old properties m_props.clear(); try { m_props.load(new FileInputStream(PFILE)); }catch(Exception e){ e.printStackTrace(); } } m_lastModifiedTime = newTime; String val = m_props.getProperty(name); if( val == null ) { return defaultVal; } else { return val; } } /** * 读取一特定的属性项 * * @param name 属性项的项名 * @return 属性项的值(如此项存在), 空(如此项不存在) */ public String getConfigItem(String name){ return getConfigItem(name,""); } }
<think>好的,我现在需要帮助用户在Flask中实现共享文件功能,并且点击文本文件时显示内容。首先,我需要回顾用户之前的提问和已有的引用内容,看看有哪些信息可以利用。 用户之前的问题是关于优化上传目录的功能,涉及分片上传、断点续传、目录结构等。现在他想在Flask中实现文件共享,并且点击文本文件显示内容。根据提供的引用,引用[1]提到使用Flask-WTF处理文件上传,引用[2]提到了Flask的instance folder和读取文件的方法,引用[3]是关于学习笔记共享平台的设计,可能涉及到文件管理和展示,引用[4]则关于表单验证。 首先,文件共享需要让用户能够上传文件,并列出已共享的文件。这涉及到文件上传、存储和展示。用户点击文本文件时显示内容,需要路由来处理文件内容的读取和展示。 接下来,我需要考虑如何构建Flask应用的结构。可能需要以下步骤: 1. **文件上传功能**:使用Flask-WTF的表单处理文件上传,如引用[1]中的示例。需要创建一个表单,包含文件上传字段和提交按钮。上传的文件需要保存到服务器的特定目录,比如使用instance文件夹(引用[2]提到的instance_path)或者其他自定义路径。 2. **文件存储与管理**:确定上传文件的存储位置。可以按照用户或日期组织目录结构,如用户之前提到的优化方案中的目录结构。这里可能需要考虑如何安全地存储文件,避免文件名冲突,以及权限管理。 3. **列出共享文件**:创建一个页面展示所有已上传的文件,每个文件作为一个链接。需要扫描存储目录中的文件,并生成对应的URL。 4. **显示文本文件内容**:当用户点击文本文件链接时,触发一个路由,读取文件内容并渲染到模板中。需要判断文件是否为文本类型(如.txt, .md等),如果是则读取内容,否则可能提供下载。 5. **安全性考虑**:确保上传的文件不会导致安全问题,比如限制文件类型,检查文件名,防止路径遍历攻击。引用[4]提到需要在服务器端验证数据,即使客户端已经做了验证,这一点很重要。 接下来,需要处理具体的代码实现。例如,使用Flask的send_file或send_from_directory来发送文件,但用户需要显示文本内容而不是下载,因此需要读取文件内容并传递给模板显示。 可能的问题点包括:如何安全地处理用户上传的文件名,防止路径遍历;如何判断文件是否为文本类型;如何高效读取和显示大文本文件等。 另外,根据用户之前的优化需求,可能还需要考虑分片上传或并发控制,但用户当前的问题可能更基础,先实现基本功能再优化。 在模板设计方面,需要一个上传表单和一个文件列表页面,每个文件条目链接到查看内容的路由。查看内容的页面需要显示文件名和内容。 总结步骤: - 创建上传表单,处理文件保存。 - 创建路由显示文件列表。 - 创建路由处理文件内容展示,读取文本文件内容并渲染。 - 添加安全性措施,如文件类型检查、文件名清理等。 现在需要将这些步骤转化为具体的代码示例,并参考已有的引用内容,比如使用Flask-WTF的表单,利用instance_path等。同时,要注意引用相关的参考文献,如处理文件上传使用引用[1]的方法,读取文件使用引用[2]的实例路径方法,验证使用引用[4]的服务器端验证。</think>--- ### Flask文件共享功能实现步骤 #### 1. **文件上传模块** - **表单定义**:使用Flask-WTF创建文件上传表单(参考引用[^1]) ```python from flask_wtf import FlaskForm from flask_wtf.file import FileField, FileAllowed from wtforms import SubmitField class FileUploadForm(FlaskForm): file = FileField('选择文件', validators=[FileAllowed(['txt', 'md'], '仅支持文本文件')]) submit = SubmitField('上传') ``` - **上传处理**:保存文件到`instance/uploads`目录(参考引用[^2]) ```python import os from flask import current_app def save_uploaded_file(file): upload_dir = os.path.join(current_app.instance_path, 'uploads') os.makedirs(upload_dir, exist_ok=True) file_path = os.path.join(upload_dir, file.filename) file.save(file_path) return file_path ``` #### 2. **文件列表展示** - **路由定义**:扫描上传目录并返回文件列表 ```python @app.route('/files') def file_list(): upload_dir = os.path.join(current_app.instance_path, 'uploads') files = os.listdir(upload_dir) return render_template('file_list.html', files=files) ``` - **模板示例**(`file_list.html`): ```html <ul> {% for file in files %} <li><a href="{{ url_for('show_file', filename=file) }}">{{ file }}</a></li> {% endfor %} </ul> ``` #### 3. **文本内容展示** - **安全读取文件**:使用`open_instance_resource`方法(参考引用[^2]) ```python @app.route('/file/<filename>') def show_file(filename): safe_filename = secure_filename(filename) # 防止路径遍历 try: with current_app.open_instance_resource(f'uploads/{safe_filename}') as f: content = f.read().decode('utf-8') return render_template('show_file.html', filename=safe_filename, content=content) except FileNotFoundError: abort(404) ``` - **展示模板**(`show_file.html`): ```html <h2>{{ filename }}</h2> <pre>{{ content }}</pre> ``` #### 4. **安全增强措施** - **文件名消毒**:使用Werkzeug的`secure_filename` ```python from werkzeug.utils import secure_filename # 上传时处理文件名 filename = secure_filename(file.filename) ``` - **文件类型验证**:结合客户端和服务端验证(参考引用[^4]) ```python # 路由中补充验证 if not allowed_file(filename): flash('文件类型不支持') return redirect(request.url) ``` #### 5. **完整路由示例** ```python from flask import Flask, render_template, request, abort app = Flask(__name__) app.config['SECRET_KEY'] = 'your_secret_key' @app.route('/upload', methods=['GET', 'POST']) def upload_file(): form = FileUploadForm() if form.validate_on_submit(): file = form.file.data if allowed_file(file.filename): save_uploaded_file(file) return redirect(url_for('file_list')) return render_template('upload.html', form=form) ``` --- ### 关键问题解决方案 1. **路径安全**:通过`secure_filename`过滤特殊字符 ```python >>> secure_filename("../../etc/passwd.txt") 'etc_passwd.txt' ``` 2. **大文件处理**:流式读取避免内存溢出 ```python def read_large_file(path): with open(path, 'r', encoding='utf-8') as f: while chunk := f.read(4096): yield chunk ``` --- ### 运行效果验证 1. 访问`/upload`上传文本文件 2. 访问`/files`查看文件列表 3. 点击文件名查看内容渲染 --- ### 进阶优化方向 1. **文件分页显示**:使用Flask-SQLAlchemy记录文件元数据 2. **权限控制**:结合用户系统实现私有/公开文件管理(参考引用[^3]) 3. **版本控制**:记录文件修改历史 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值