2016-05-16 14:42:01 kellyseeme 阅读数 3749
  • Python-数据

    Python数据库编程视频教程,数据库是MySQL,讲解Python链接MySQL数据库,并对数据库进行增删改查操作。

    10783 人正在学习 去看看 尹成

python中读取数据的时候有几种方法,无非是read,readline,readlings和xreadlines几种方法,在几种方法中,read和xreadlines可以作为迭代器使用,从而在读取大数据的时候比较有效果.

在测试中,先创建一个大文件,大概1GB左右,使用的程序如下:

import os.path
import time
while os.path.getsize('messages') <1000000000:
    f = open('messages','a')
    f.write('this is a file/n')
    f.close()

print 'file create complted'

在这里使用循环判断文件的大小,如果大小在1GB左右,那么结束创建文件。--需要花费好几分钟的时间。


测试代码如下:

#22s
start_time = time.time()
f = open('messages','r')
for i in f:
    end_time = time.time()
    print end_time - start_time
    break
f.close()

#22s
start_time = time.time()
f = open('messages','r')
for i in f.xreadlines():
    end_time = time.time()
    print end_time - start_time
    break
f.close()


start_time = time.time()
f = open('messages','r')
k= f.readlines()
f.close()
end_time = time.time()
print end_time - start_time

使用迭代器的时候,两者的时间是差不多的,内存消耗也不是很多,使用的时间大概在22秒作用

在使用完全读取文件的时候,使用的时间在40s,并且内存消耗相当严重,大概使用了1G的内存。。


其实,在使用跌倒器的时候,如果进行连续操作,进行print或者其他的操作,内存消耗还是不可避免的,但是内存在那个时候是可以释放的,从而使用迭代器可以节省内存,主要是可以释放。

而在使用直接读取所有数据的时候,数据会保留在内存中,是无法释放这个内存的,从而内存卡死也是有可能的。


在使用的时候,最好是直接使用for i in f的方式来使用,在读取的时候,f本身就是一个迭代器,其实也就是f.read方法



2017-05-17 20:40:59 whgyxy 阅读数 1459
  • Python-数据

    Python数据库编程视频教程,数据库是MySQL,讲解Python链接MySQL数据库,并对数据库进行增删改查操作。

    10783 人正在学习 去看看 尹成

python普通文件读写

open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)

常用的参数有文件路径file和读写模式mode

字符 含义
‘r’ 只读模式(默认)
‘w’ 只写模式
‘a’ 追加写模式
‘b’ 二进制模式
‘t’ 文本模式(默认)
‘+’ 更新模式(一般和其他模式并用)

打开的文件描述符有以下几个常用的函数

读写函数

read & write

f = open(yourfilepath, 'r')
ss = f.read()  # 读进文件的全部内容返回一个字符串
ss = f.read(1024)  # 读取指定字节的内容返回一个字符串

line = f.readline()  # 读取文件的一行返回字符串(包含换行符)
line = line.strip("\n")  # 处理的时候一般要去掉换行符(这里是\n)

lines = f.readlines()  # 读取所有行返回一个列表list,每个元素(类型为字符串)为文件的一行
for line in f.readlines():
    pass
f.close()  # 文件用完要记得关闭,可以用with关键字,不用手动关闭,程序会自动关闭

# 以下均用with来读写文件
with open('yourfilepath', 'w') as tmpf:
    a = 100; b = 97.5; c = 'Good'
    tmpf.write('number=%d  score=%f  result%s' % (a, b, c))
    # 或者直接写入文件内容——字符串(或二进制数据)
    ss = 'yourstring'
    f.write(ss)  # 直接写入

ss = 'yourstring'
f.writeline(ss)  # 写入时会自动加入换行符

ss = ['a', 'b', 'c']
f.writelines(ss)  # 参数为字符串序列

python大文件读写

内置方法

大文件读写的时候如果使用上面的函数内存分分钟会爆掉,需要使用python的生成器
open函数返回的其实还是一个生成器,不管文件多大,可以一行一行读取

with open(yourfilepath,'r') as f:
    for line in f:
        pass  # 对每行做处理

pandas

pandas的read_csv函数可以分块读取数据

### 分批加载训练集
chunksize = 10000
reader = pd.read_table(yourfile, chunksize=chunksize)
for line in reader:
    pass  # 对每行做处理

# 或者使用iterator获得迭代对象
reader = pd.read_table(yourfile, iterator=True)
loop = True
while loop:
    try:
        chunk = reader.get_chunk(chunkSize)
        pass  # 对每行做处理
    except StopIteration:
        loop = False

分块生成批量数据

在深度学习中,经常需要送入批量数据,可以使用生成器来完成

import numpy as np
import pandas as pd

# batch_size为皮尺寸
# datapath为数据集路径
# labelpath标签路径
def data_iter(batch_size, datapath, labelpath):
    train_x = pd.read_csv(datapath)
    train_y = pd.read_csv(labelpath)
    while(1):   # 死循环,因为数据要循环读取,epoch的缘故
        nb_batch = np.ceil(train_x.shape[0] * 1.0 / batch_size)
        for i in range(int(nb_batch)):
            start = i*batch_size
            end = min((i+1)*batch_size, train_x.shape[0])
            # 生成器生成需要的数据(X,Y)
            yield (train_x[start:end], train_y[start:end])

参考网站
1 使用Python Pandas处理亿级数据
2 pandas.read_csv——分块读取大文件
3 pandas.read_csv参数整理
4 The Python Standard Library I/O
5 强悍的 Python —— 读取大文件
6 python:open函数的使用方法
7 Python读写文件
8 python 如何读取大文件
9 Python linecache模块缓存读取大文件指定行
10 python读文件的三个方法read()、readline()、readlines()详解

2017-06-27 15:15:12 meiguopai1 阅读数 3518
  • Python-数据

    Python数据库编程视频教程,数据库是MySQL,讲解Python链接MySQL数据库,并对数据库进行增删改查操作。

    10783 人正在学习 去看看 尹成

python  从文件读写,mysql批量插入测试数据

采用了两种方法,第一中直接向mysql插入随机测试数据,第二种采用读写文件从文件中读入数据插入mysql,适合从生产环境导入数据到测试环境库。

# encoding=utf-8
# 测试数据制造
import pymysql
import random
import time
import string
import csv
import os

conn = pymysql.connect(host='192.168.152.128', port=3306, user='root', passwd='root', db='test')


# 循环生成随机数据到插入到mysql中
# 三个字段,id,name,age
class TEST_INSERT_MYSQL:
    def __init__(self, conn):
        self.conn = conn

    def init_mysql_data(self):
        try:
            cur = conn.cursor()
            cur.execute("drop table if exists student")
            sql = "create table if not exists student(id int not null AUTO_INCREMENT PRIMARY KEY ,name char(20),age char(3))"  # 自增长
            cur.execute(sql)

            print(time.ctime())
            for i in range(1, 1000):
                random_name = ''.join(random.sample(string.ascii_letters + string.digits, 8))  # 8位随机字符
                random_age = ''.join(str(random.randint(10, 120)))  # 10-120随机字符
                value = (random_name, random_age)
                insert_sql = "insert into  student(name,age) values(%s,%s)"
                cur.execute(insert_sql, value)
                i += 1
                conn.commit()
            print(time.ctime())
        except:
            conn.rollback()
            print("Insert fail")
        cur.close()
        conn.close()
    #定义了一个写入函数,从文件读取数据插入数据库
    def insert_mysql(self, data):
        cur = conn.cursor()
        print(time.ctime())
        for i in range(1, len(data)):
            insert_sql = "insert into  student(name,age) values(%s,%s)"
            value = (data[i][1], data[i][2])
            cur.execute(insert_sql, value)
            i += 1
            conn.commit()
        print(time.ctime())
        cur.close()
        conn.close()


# 读写操作txt文本文件,定义一个写函数一个读函数
class OPREATE_FILE():
    # 写测试文件
    def write_file(self, filename):
        if os.path.exists(filename):  # 删除存在的测试文件
            os.remove(filename)
        with open(filename, 'w') as f:
            for i in range(1, 100):
                random_name = ''.join(random.sample(string.ascii_letters + string.digits, 8))
                random_age = str(random.randint(10, 120))
                list = [str(i)]
                list.append(random_name)
                list.append(random_age)
                data = ','.join(list)
                f.write(data + '\n')
                assert isinstance(i, object)
                i += i

    # 读测试文件
    def read_file(self, filename):
        list = []
        with open(filename, 'r') as f:
            for lines in f:
                line = lines.split(',')
                data = (line[0], line[1], line[2].replace("\n", ""))
                list.append(data)

            return list

#以下为测试部分
Test = TEST_INSERT_MYSQL(conn)
# Test.insert_mysql_data()

Test_data = OPREATE_FILE()
# Test_data.write_file('test_data.txt')
A = Test_data.read_file('test_data.txt')
Test.insert_mysql(A)


2019-08-19 17:59:42 lchmyhua88 阅读数 155
  • Python-数据

    Python数据库编程视频教程,数据库是MySQL,讲解Python链接MySQL数据库,并对数据库进行增删改查操作。

    10783 人正在学习 去看看 尹成

python  从文件读写,mysql批量插入数据

采用了两种方法,第一中直接向mysql插入随机测试数据,第二种采用读写文件从文件中读入数据插入mysql,适合从生产环境导入数据到测试环境库。

如果数据量很大的话,读取一条插入一条,那么性能将会很低效,因此需要没读取一批,然后在批量插入,多次循环即可。下面直接看代码:

# -*- coding: utf-8 -*-

import os
import mysql.connector

from sqlalchemy import text
import gzip
import json,datetime,decimal

config = {
    'user': 'homestead',
    'password': 'secret',
    'host': '127.0.0.1',
    'database': 'testuser',
    'raise_on_warnings': True,
}
cnx = mysql.connector.connect(**config)


class ReadFile:
    def readLines(self):
        fname = '/htdocs/python/user_log.txt.zip'
        f = gzip.open(fname, "rb")
        i = 0
        list = []
        for line in f:
            #strs = line.split("\t")
            st = line.decode('utf-8').replace('\n', '')
            st = json.loads(st)
            #if len(st) != 10:
                #continue
            data = (st[0],st[1],st[2],st[3],st[4],st[5],st[6].replace("\n", ""))
            list.append(data)
            cursor = cnx.cursor()
            sql = "insert into user_log(id,name,nickname,create_date,uuid,update_date,is_del)values(%s,%s,%s,%s,%s,%s,%s)"
            if i > 3:
                cursor.executemany(sql, list)
                cnx.commit()
                print("插入")
                i = 0
                list.clear()
            i = i + 1
        if i > 0:
            cursor.executemany(sql, list)
            cnx.commit()
        cnx.close()
        f.close()
        print("ok")


if __name__ == "__main__":
    readFile = ReadFile()
    readFile.readLines()

 

对几百万的数据就可以很快的插入表中了。

2018-08-19 17:17:25 csucsgoat 阅读数 667
  • Python-数据

    Python数据库编程视频教程,数据库是MySQL,讲解Python链接MySQL数据库,并对数据库进行增删改查操作。

    10783 人正在学习 去看看 尹成

很多时候,由于数据众多,分别保存在文件夹里,此时需要批量打开文件读取,然后对数据整合进行操作。那么就必须通过使用os模块和open函数相结合,通过os模块得到全部的文件,然后通过open函数打开文件读写。

1、创建一个文件夹test_file,里面包含4个文件 
这里写图片描述

2、通过os模块读取文件夹的所有文件

In [1]: import os
In [2]: os.listdir(r'C:\Users\BruceWong\.spyder-py3\test_file')
Out[2]: ['a.txt', 'b.txt', 'c.txt', 'd.txt']
  • 1
  • 2
  • 3

3、读取每个文件内容

In [7]: for info in os.listdir(r'C:\Users\BruceWong\.spyder-py3\test_file'):
   ...:     domain = os.path.abspath(r'C:\Users\BruceWong\.spyder-py3\test_file') #获取文件夹的路径,此处其实没必要这么写,目的是为了熟悉os的文件夹操作
   ...:     info = os.path.join(domain,info) #将路径与文件名结合起来就是每个文件的完整路径
   ...:     info = open(info,'r') #读取文件内容
   ...:     print(info.readline()) #使用readline函数得到一条一条的信息,如果使用read获取全部信息亦可;
   ...:     info.close()
   ...:
   ...:
aaa
bbb
ccc
ddd

通过简单的两步就能完成文件夹内所有文件的读取。

没有更多推荐了,返回首页