python读取文件内容存入mysql

本文介绍了一种使用Python从TXT文件批量导入数据到MySQL数据库的方法,并解决了在此过程中可能出现的乱码问题。通过示例代码展示了如何逐行读取TXT文件内容并将其插入到指定的数据库表中。

mysql导入支持sql文件和txt文件(csv),但在txt直接导入会出现乱码,所以直接用python读取每一行,然后写入数据库。
最近看兄长生写jsp代码,逻辑运转之快让我们瞠目结舌,常年写代码才是技术积累的关键啊。不知道十年以后会不会像兄长这么牛逼。。。
下面贴代码:
python处理乱码主要有三步:

  • 创建数据库时声明
CREATE DATABASE xxx DEFAULT CHARACTER SET utf8 
  • 连接数据库时声明
conn = MySQLdb.connect(
                host='localhost',
                port=3306,
                user='root',
                passwd='root',
                db='test',
                charset='utf8',
            )
  • sql语句声明
cur.execute(
                        "insert into data4(source_ip,source_port,des_ip,des_port,date,title) values(%s,%s,%s,%s,%s,%s)",
                        [output.source_ip, output.source_port, output.des_ip, output.des_port, output.date,
                         output_title.encode('utf-8')])

下面是完整代码:

#coding=utf-8
import MySQLdb
conn = MySQLdb.connect(
                host='localhost',
                port=3306,
                user='root',
                passwd='root',
                db='test',
                charset='utf8',
            )
cur = conn.cursor()
f = open("new.txt", "r")
while True:
    line = f.readline()
    if line:
        #处理每行\n
        line = line.strip('\n')
        line = line.split(",")
        print line
        tel = line[0]
        province = line[1]
        city = line[2]
        call_type = line[3]
        cur.execute(
            "insert into data9(tel,province,city,cell_type) values(%s,%s,%s,%s)",
            [tel, province, city, call_type])
    else:
        break
f.close()
cur.close()
conn.commit()
conn.close()
<think>我们使用MySQL数据库存储图片,通常是将图片作为BLOB(Binary Large Object)类型的数据存入表中。 步骤: 1. 创建数据库和表,表中包含一个BLOB类型的列用于存储图片数据。 2. 使用Python连接MySQL数据库。 3. 读取图片文件,将其转换为二进制数据。 4. 执行SQL插入语句,将二进制数据插入到表中。 根据引用[3]和引用[4]的示例,我们可以总结如下: 示例代码: 首先,确保已经安装MySQL数据库,并创建了数据库和表。例如,创建一个名为`mydb`的数据库,其中有一个表`images`,包含字段: - `id`: INT 自增主键 - `name`: VARCHAR(100) 图片名称 - `data`: BLOB 图片数据 然后,使用Python代码实现: 安装必要的库:`mysql-connector-python` 或 `pymysql`。这里我们使用`pymysql`。 如果未安装,请先安装:`pip install pymysql` 代码步骤: 1. 连接数据库 2. 打开图片文件读取为二进制数据 3. 将二进制数据插入到数据库 4. 提交并关闭连接 注意:在插入时,使用参数化查询,避免SQL注入,并使用`mysql.Binary`(如果使用MySQLdb)或直接使用二进制数据(在pymysql中,可以直接使用字节数据,但需要确保使用参数化查询)。 由于引用[3]使用了`MySQLdb`,而引用[4]使用了`pymysql`,这里我们使用`pymysql`,因为它是纯Python实现,兼容性更好。 示例代码如下:</think>### 使用Python将图片存储MySQL数据库的方法 在MySQL存储图片需要将图像转换为二进制数据(BLOB类型),以下是详细步骤和代码实现: #### 步骤1:创建数据库表 ```sql CREATE TABLE images ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(255) NOT NULL, -- 图片名称 data LONGBLOB NOT NULL, -- 存储二进制数据 created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); ``` #### 步骤2:Python存储代码(使用pymysql) ```python import pymysql from datetime import datetime def save_image_to_db(file_path, image_name): # 1. 连接数据库 connection = pymysql.connect( host='localhost', user='your_username', password='your_password', database='your_database', charset='utf8mb4' ) try: # 2. 读取图片为二进制 with open(file_path, 'rb') as file: image_data = file.read() # 3. 执行插入操作 with connection.cursor() as cursor: sql = """INSERT INTO images (name, data) VALUES (%s, %s)""" cursor.execute(sql, (image_name, image_data)) # 4. 提交事务 connection.commit() print(f"图片 {image_name} 存储成功!") finally: connection.close() # 使用示例 save_image_to_db('./photo.jpg', '示例图片') ``` #### 关键说明: 1. **BLOB类型选择**: - `TINYBLOB`:最大255字节 - `BLOB`:最大65KB - `MEDIUMBLOB`:最大16MB - `LONGBLOB`:最大4GB(推荐存储图片) 2. **性能优化**: ```python # 在连接时添加优化参数 connection = pymysql.connect( ... max_allowed_packet=16*1024*1024 # 允许16MB数据包 ) ``` 3. **安全注意事项**: - 使用参数化查询防止SQL注入 - 限制上传文件大小(前端+后端双重验证) - 设置数据库用户最小权限原则 #### 提取图片示例 ```python def load_image_from_db(image_id, save_path): connection = pymysql.connect(...) # 同上 try: with connection.cursor() as cursor: cursor.execute("SELECT data FROM images WHERE id=%s", (image_id,)) result = cursor.fetchone() if result: with open(save_path, 'wb') as file: file.write(result[0]) print(f"图片已保存到 {save_path}") finally: connection.close() # 使用示例 load_image_from_db(1, './restored.jpg') ``` #### 最佳实践建议: 1. **存储路径而非数据**(推荐替代方案): ```sql ALTER TABLE images ADD COLUMN file_path VARCHAR(500); ``` - 优点:减少数据库压力,提高访问速度 - 缺点:需额外管理文件系统 2. **压缩处理**: ```python from PIL import Image import io # 压缩图片至50%质量 img = Image.open('photo.jpg') img_byte_arr = io.BytesIO() img.save(img_byte_arr, format='JPEG', quality=50) image_data = img_byte_arr.getvalue() ``` 3. **数据库连接池**(高并发场景): ```python from DBUtils.PooledDB import PooledDB pool = PooledDB(pymysql, 5, host='localhost', user='...', ...) connection = pool.connection() ``` [^1]: 使用BLOB类型存储二进制数据是MySQL的标准方法 [^2]: 实际应用中需要权衡直接存储与路径存储的优缺点 [^3]: 参数化查询是防止SQL注入的关键安全措施 [^4]: LONGBLOB类型支持最大4GB数据存储
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值