python 处理大数据文本_python处理文本数据 按行处理 python 3 - CSDN
  • 大数据文本分析与应用,Python实现小说文本词频统计,保存到数据库,并实现数据可视化(jsp web前端)

    实践课题报告: 大数据文本分析与应用

    学 校:xxx

    学 院:大数据与智能工程学院

    专 业:信息工程(数据科学与大数据技术)

    年 级:2017级

    学 号:xxx

    姓 名:xxx

    指导老师:xxx

    日 期:2019 年 6 月 27 日 至 29 日

    实习要求:

    使用Python,实现对英文小说的词频解析,并将每章的词频结果存入到Mysql数据库中。
    开发简易信息系统,实现对某篇小说的词频查询。

    环境配置

    1.Python3.7 (数据处理及对数据库的操作)
    2.MySQL5.7(存储分析结果)
    3.Tomcat9(部署前端代码,实现客户端访问)

    第一步:读取数据,并进行预处理

    #获取数据并对其进行去空行,空白处理
    def get_data( filename):
        data = ''
        with open(filename, "r") as f:
            for line in f.readlines():
                line = line.rstrip() #去掉列表右边的空白
                line = line.lstrip() #去掉列表左边的空白
                #全变为小写
                #line = line.lower()
                #将特殊字符替换为空格
                for ch in '!"#$%@~`^&*\'\“”’。,()_-+=/{\\}[|]?.><,/;':
                    line = line.replace(ch, " ") 
                if line is not '':
                    data = data+line+' '
        return data
    
    ```python
    

    第二步:按章节进行分词和统计

    #获取章节单词 ,key="CHAPTER",章节分割词
    def get_chapter_word(key ,data):
        #分词
        words = data.split()
        chapters ={}
        j=0
        for word in words:
            if(word == key):
                    j+=1
            if j == 0:
                chapters['book'] = chapters.get('book','')+word+" "
            else:
                keys = key+str(j)
                chapters[keys] = chapters.get(keys,'')+word+" "
        chapter_words = list(chapters.items())
        return chapter_words
    
    #按按章节进行词频统计
    def word_count(chapter_word):
         #全变为小写
        chapter_word = chapter_word.lower()
        words = chapter_word.split()
        #字典存储单词和数量
        counts ={}
        for word in words:
            counts[word] = counts.get(word,0) + 1
        items = list(counts.items())
        #大到小快速排序
        items.sort(key=lambda x:x[1], reverse=True)
        return items
    

    第三步:数据库操作

    import pymysql
    #连接数据库
    def connectdb():
        localhost = " localhost"
        username = "root"
        password = "123456"
        DBname = "test"
        #print('连接到mysql服务器...')
        # 打开数据库连接
        db = pymysql.connect(localhost,username,password,DBname)
        #print('连接上了!')
        return db
        
    #存入数据库,书名,章节,单词,词频
    def insert(db,bookname,chapter,word, counts):
        # 使用cursor()方法获取操作游标 
        cursor = db.cursor()
        # SQL 插入语句
        sql = "INSERT INTO txtdata(bookname, \
           chapter, word, counts) \
           VALUES ('%s', '%s', '%s',  %s)" % \
           (bookname, chapter,word, counts)
        try:
            # 执行sql语句
            cursor.execute(sql)
            # 执行sql语句
            db.commit()
        except:
            # 发生错误时回滚
            db.rollback()
    
    #查询数据库
    def select(sql):
        #连接数据库
        db= connectdb()
        # 使用cursor()方法获取操作游标 
        cursor = db.cursor()
        try:
            #记录总的次数
            count = 0
            # 执行SQL语句
            cursor.execute(sql)
            # 获取所有记录列表
            results = cursor.fetchall()
            for row in results:
                bookname = row[0]
                chapter = row[1]
                counts = row[2]
                count += counts
                # 打印结果
                print ("书名:%s \t 章节:%s \t 词频:%d" %(bookname,chapter,counts))
            print("总的出现频率为:%d"%(count))
        except:
            print ("词库无此单词!!!")
        # 关闭数据库连接
        db.close()  
        
    #按单词查询所有的词频记录
    def select_by_word(word):
        # SQL 查询语句
        sql = "SELECT bookname, chapter,counts FROM txtdata WHERE trim(replace(word,' ','')) = trim(replace('%s',' ',''))" % (word)
        #调用查询函数
        select(sql)
        
    #查询指定书的查询指定单词的词频
    def select_by_bookname(bookname,word):
        # SQL 查询语句
        sql = "SELECT bookname, chapter,counts FROM txtdata WHERE trim(replace(bookname,' ','')) =\
        trim(replace('%s',' ','')) and trim(replace(word,' ','')) = trim(replace('%s',' ',''))" % (bookname,word)
        #调用查询函数
        select(sql)
    

    第四步:存储数据,查询词频

    #存入数据库主函数
    def insert_main(filename):
        #filename = 'Jane_Eyre.txt'
        #读取数据
        data=get_data(filename)
        #获取章节单词 ,key="CHAPTER",章节分割词库
        key="CHAPTER"
        #录入信息条数
        count = 0
        
         #连接数据库
        db= connectdb()
    
        chapter_words = get_chapter_word(key ,data)
        for i in range(len(chapter_words)):
            if i == 0:
                continue
            else:
                chapter,chapter_word = chapter_words[i]
                chapter_word = chapter_word.rstrip().lstrip()
                #按按章节进行词频统计
                items = word_count(chapter_word)
                for j in range(len(items)):
                    word, counts= items[j]
                    #print("{0:<10}{1:>5}".format(word, count))
                    try:
                        #存入数据库,书名,章节,单词,词频
                        insert(db,chapter_words[0][1],chapter,word, counts)
                    except:
                        continue
                    count+=1
            print("已录入%d章节的数据》》》"%(i))
        # 关闭数据库连接
        db.close()  
        print("本次总共录入%d条数据"%(count))
    
    #按单词查询主函数
    def select_main():
        word = input("请输入你要查询的单词:")
        word = word.lower()
        print("\n查询结果:\n")
        select_by_word(word)
    
    ##查询指定书的查询指定单词的词频主函数
    def select_by_bookname_main():
        bookname = input("请输入书名:")
        word = input("\n请输入你要查询的单词:")
        word = word.lower()
        print("\n查询结果:\n")
        select_by_bookname(bookname,word)
    

    第五步:测试

    存入数据库

    # txt文件和当前脚本在同一目录下,所以不用写具体路径
    filename_path = ['Two_Cities.txt','Jane_Eyre.txt']
    for filename in filename_path:
        #存入数据库
       # insert_main(filename)
    
    已录入1章节的数据》》》
    已录入2章节的数据》》》
    已录入3章节的数据》》》
    已录入4章节的数据》》》
    已录入5章节的数据》》》
    已录入6章节的数据》》》
    已录入7章节的数据》》》
    已录入8章节的数据》》》
    已录入9章节的数据》》》
    已录入10章节的数据》》》
    已录入11章节的数据》》》
    已录入12章节的数据》》》
    已录入13章节的数据》》》
    已录入14章节的数据》》》
    已录入15章节的数据》》》
    已录入16章节的数据》》》
    已录入17章节的数据》》》
    已录入18章节的数据》》》
    已录入19章节的数据》》》
    已录入20章节的数据》》》
    已录入21章节的数据》》》
    已录入22章节的数据》》》
    已录入23章节的数据》》》
    已录入24章节的数据》》》
    已录入25章节的数据》》》
    已录入26章节的数据》》》
    已录入27章节的数据》》》
    已录入28章节的数据》》》
    已录入29章节的数据》》》
    已录入30章节的数据》》》
    已录入31章节的数据》》》
    已录入32章节的数据》》》
    已录入33章节的数据》》》
    已录入34章节的数据》》》
    已录入35章节的数据》》》
    已录入36章节的数据》》》
    已录入37章节的数据》》》
    已录入38章节的数据》》》
    已录入39章节的数据》》》
    已录入40章节的数据》》》
    已录入41章节的数据》》》
    已录入42章节的数据》》》
    已录入43章节的数据》》》
    已录入44章节的数据》》》
    本次总共录入%d条数据
    已录入1章节的数据》》》
    已录入2章节的数据》》》
    已录入3章节的数据》》》
    已录入4章节的数据》》》
    已录入5章节的数据》》》
    已录入6章节的数据》》》
    已录入7章节的数据》》》
    已录入8章节的数据》》》
    已录入9章节的数据》》》
    已录入10章节的数据》》》
    已录入11章节的数据》》》
    已录入12章节的数据》》》
    已录入13章节的数据》》》
    本次总共录入%d条数据
    

    数据库表

    在这里插入图片描述

    按单词查询所有

     #查询1
    select_main()
    
    请输入你要查询的单词:the
    
    查询结果:
    
    书名: Two Cities 	 章节:CHAPTER1 	 词频:79
    书名: Two Cities 	 章节:CHAPTER2 	 词频:194
    书名: Two Cities 	 章节:CHAPTER3 	 词频:123
    书名: Two Cities 	 章节:CHAPTER4 	 词频:203
    书名: Two Cities 	 章节:CHAPTER5 	 词频:284
    书名: Two Cities 	 章节:CHAPTER6 	 词频:331
    书名: Two Cities 	 章节:CHAPTER7 	 词频:171
    书名: Two Cities 	 章节:CHAPTER8 	 词频:298
    书名: Two Cities 	 章节:CHAPTER9 	 词频:89
    书名: Two Cities 	 章节:CHAPTER10 	 词频:137
    书名: Two Cities 	 章节:CHAPTER11 	 词频:228
    书名: Two Cities 	 章节:CHAPTER12 	 词频:263
    书名: Two Cities 	 章节:CHAPTER13 	 词频:166
    书名: Two Cities 	 章节:CHAPTER14 	 词频:348
    书名: Two Cities 	 章节:CHAPTER15 	 词频:94
    书名: Two Cities 	 章节:CHAPTER16 	 词频:41
    书名: Two Cities 	 章节:CHAPTER17 	 词频:102
    书名: Two Cities 	 章节:CHAPTER18 	 词频:56
    书名: Two Cities 	 章节:CHAPTER19 	 词频:212
    书名: Two Cities 	 章节:CHAPTER20 	 词频:87
    书名: Two Cities 	 章节:CHAPTER21 	 词频:284
    书名: Two Cities 	 章节:CHAPTER22 	 词频:208
    书名: Two Cities 	 章节:CHAPTER23 	 词频:118
    书名: Two Cities 	 章节:CHAPTER24 	 词频:152
    书名: Two Cities 	 章节:CHAPTER25 	 词频:34
    书名: Two Cities 	 章节:CHAPTER26 	 词频:264
    书名: Two Cities 	 章节:CHAPTER27 	 词频:145
    书名: Two Cities 	 章节:CHAPTER28 	 词频:232
    书名: Two Cities 	 章节:CHAPTER29 	 词频:252
    书名: Two Cities 	 章节:CHAPTER30 	 词频:296
    书名: Two Cities 	 章节:CHAPTER31 	 词频:167
    书名: Two Cities 	 章节:CHAPTER32 	 词频:78
    书名: Two Cities 	 章节:CHAPTER33 	 词频:178
    书名: Two Cities 	 章节:CHAPTER34 	 词频:121
    书名: Two Cities 	 章节:CHAPTER35 	 词频:191
    书名: Two Cities 	 章节:CHAPTER36 	 词频:106
    书名: Two Cities 	 章节:CHAPTER37 	 词频:227
    书名: Two Cities 	 章节:CHAPTER38 	 词频:270
    书名: Two Cities 	 章节:CHAPTER39 	 词频:352
    书名: Two Cities 	 章节:CHAPTER40 	 词频:53
    书名: Two Cities 	 章节:CHAPTER41 	 词频:146
    书名: Two Cities 	 章节:CHAPTER42 	 词频:252
    书名: Two Cities 	 章节:CHAPTER43 	 词频:204
    书名: Two Cities 	 章节:CHAPTER44 	 词频:150
    书名: Jane Eyre 	 章节:CHAPTER1 	 词频:86
    书名: Jane Eyre 	 章节:CHAPTER2 	 词频:104
    书名: Jane Eyre 	 章节:CHAPTER3 	 词频:118
    书名: Jane Eyre 	 章节:CHAPTER4 	 词频:203
    书名: Jane Eyre 	 章节:CHAPTER5 	 词频:264
    书名: Jane Eyre 	 章节:CHAPTER6 	 词频:110
    书名: Jane Eyre 	 章节:CHAPTER7 	 词频:178
    书名: Jane Eyre 	 章节:CHAPTER8 	 词频:90
    书名: Jane Eyre 	 章节:CHAPTER9 	 词频:128
    书名: Jane Eyre 	 章节:CHAPTER10 	 词频:179
    书名: Jane Eyre 	 章节:CHAPTER11 	 词频:250
    书名: Jane Eyre 	 章节:CHAPTER12 	 词频:164
    书名: Jane Eyre 	 章节:CHAPTER13 	 词频:160
    总的出现频率为:10020
    

    按指定书名查询指定单词的词频

     #查询2
    select_by_bookname_main()
    
    请输入书名:Jane Eyre
    
    请输入你要查询的单词:the
    
    查询结果:
    
    书名: Jane Eyre 	 章节:CHAPTER1 	 词频:86
    书名: Jane Eyre 	 章节:CHAPTER2 	 词频:104
    书名: Jane Eyre 	 章节:CHAPTER3 	 词频:118
    书名: Jane Eyre 	 章节:CHAPTER4 	 词频:203
    书名: Jane Eyre 	 章节:CHAPTER5 	 词频:264
    书名: Jane Eyre 	 章节:CHAPTER6 	 词频:110
    书名: Jane Eyre 	 章节:CHAPTER7 	 词频:178
    书名: Jane Eyre 	 章节:CHAPTER8 	 词频:90
    书名: Jane Eyre 	 章节:CHAPTER9 	 词频:128
    书名: Jane Eyre 	 章节:CHAPTER10 	 词频:179
    书名: Jane Eyre 	 章节:CHAPTER11 	 词频:250
    书名: Jane Eyre 	 章节:CHAPTER12 	 词频:164
    书名: Jane Eyre 	 章节:CHAPTER13 	 词频:160
    总的出现频率为:2034
    

    六、前端页面效果

    index.jsp

    <%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
        <% request.setCharacterEncoding("UTF-8"); %> 
    <%@ page import="java.sql.*"%> 
    <html>
    <head>
    <title>Python大数据文本分析</title>
    <body >   
    
    <div align="center"style="width: 80%;">
    <br/><br/><br/>
    <h1>Python大数据文本分析</h1><br/>
    <p>目前已有书本:<a>Jane Eyre</a> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a>Two_Cities</a> <br/><br/>
    <a href="word.jsp"><h3>按单词查询所有书本的词频</h3></a> <br><br>
    <a href="book.jsp"><h3>查询指定书本中的指定单词词频</h3></a>
    </div>
    </body>   
    </html> 
    

    在这里插入图片描述

    word.jsp

    <%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
        <% request.setCharacterEncoding("UTF-8"); %>
    <%@ page import="java.sql.*"%> 
    <html>
    <head>
    <title>查询</title>
    <body >   
    <div align="center"style="width: 80%;">
    <br/><br/><br/>
    <h3>查询指定书本中的指定单词词频</h3><br/><br/>
    <p>目前已有书本:<a>Jane Eyre</a> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a>Two_Cities</a> <br/><br/><br/>
    <form  action="select_word.jsp" method="post">
    <p>请输入单词:<input type="text" name="word" /><br/>
    <p><input type="submit" value="查询"/>
    <p><a href="index.jsp">返回首页</a>
    <div>
    </body>   
    </html> 
    

    在这里插入图片描述

    select_word.jsp

    <%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
        <% request.setCharacterEncoding("UTF-8"); %>
    <%@ page import="java.sql.*"%>
    
    <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
    <%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql"%>
    
    <html>   
    <body > 
    <sql:setDataSource var="snapshot" driver="com.mysql.jdbc.Driver"
         url="jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf-8"
         user="root"  password="123456"/>
     
     <sql:query dataSource="${snapshot}" var="result">
     SELECT bookname,chapter,word,counts FROM txtdata WHERE trim(replace(word,' ','')) = trim(replace('${param.word}',' ',''))
    
    </sql:query>
    <div align="center" style="width: 80%;">
     <h1>Python大数据文本分析<h1><br/><br/>
    <table align="center" border="1" width="70%">
    <tr>
       <th>书名</th>
       <th>章节</th>
       <th>单词</th>
       <th>词频</th>
    </tr>
    <c:forEach var="row" items="${result.rows}">
    <tr>
       <td><c:out value="${row.bookname}"/></td>
       <td><c:out value="${row.chapter}"/></td>
       <td><c:out value="${row.word}"/></td>
       <td><c:out value="${row.counts}"/></td>
    </tr>
    </c:forEach>
    </table>
    <p><a href="index.jsp">返回首页</a>
    </div>
    </body>   
    </html> 
    

    在这里插入图片描述

    book.jsp

    <%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
        <% request.setCharacterEncoding("UTF-8"); %>
    <%@ page import="java.sql.*"%> 
    <html>
    <head>
    <title>查询</title>
    <body >   
    <div align="center"style="width: 80%;">
    <br/><br/><br/>
    <h3>查询指定书本中的指定单词词频</h3><br/><br/>
    <p>目前已有书本:<a>Jane Eyre</a> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a>Two_Cities</a> <br/><br/><br/>
    <form  action="select_book.jsp" method="post">
    <p>请输入书名:<input type="text" name="book" /><br/>
    <p>请输入单词:<input type="text" name="word" /><br/>
    <p><input type="submit" value="查询"/>
    <p><a href="index.jsp">返回首页</a>
    <div>
    </body>   
    </html> 
    

    在这里插入图片描述

    select_book.jsp

    <%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
        <% request.setCharacterEncoding("UTF-8"); %>
    <%@ page import="java.sql.*"%>
    
    <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
    <%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql"%>
    
    <html>   
    <body > 
    
    <sql:setDataSource var="snapshot" driver="com.mysql.jdbc.Driver"
         url="jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf-8"
         user="root"  password="123456"/>
     
     <sql:query dataSource="${snapshot}" var="result">
     SELECT bookname, chapter, word,counts FROM txtdata WHERE trim(replace(bookname,' ','')) =trim(replace('${param.book}',' ','')) and trim(replace(word,' ','')) = trim(replace('${param.word}',' ',''))
    
    </sql:query>
    <div align="center" style="width: 80%;">
     <h1>Python大数据文本分析<h1><br/><br/>
    <table align="center" border="1" width="70%">
    <tr>
       <th>书名</th>
       <th>章节</th>
       <th>单词</th>
       <th>词频</th>
    </tr>
    <c:forEach var="row" items="${result.rows}">
    <tr>
       <td><c:out value="${row.bookname}"/></td>
       <td><c:out value="${row.chapter}"/></td>
       <td><c:out value="${row.word}"/></td>
       <td><c:out value="${row.counts}"/></td>
    </tr>
    </c:forEach>
    </table>
    <p><a href="index.jsp">返回首页</a>
    </div>
    </body>   
    </html> 
    

    在这里插入图片描述

    数据集及源码

    展开全文
  • 博文1:pandas.read_csv——分块读取大文件 ... 今天在读取一个超大csv文件的时候,遇到困难...首先使用office打不开然后在python中使用基本的pandas.read_csv打开文件时:MemoryError最后查阅read_csv文档发现可以

    博文1:pandas.read_csv——分块读取大文件

    http://blog.csdn.net/zm714981790/article/details/51375475

    今天在读取一个超大csv文件的时候,遇到困难:

    • 首先使用office打不开
    • 然后在python中使用基本的pandas.read_csv打开文件时:MemoryError
    • 最后查阅read_csv文档发现可以分块读取。
    • read_csv中有个参数chunksize,通过指定一个chunksize分块大小来读取文件,返回的是一个可迭代的对象TextFileReader,IO Tools 举例如下:
    In [138]: reader = pd.read_table('tmp.sv', sep='|', chunksize=4)
    
    In [139]: reader
    Out[139]: <pandas.io.parsers.TextFileReader at 0x120d2f290>
    
    In [140]: for chunk in reader:
       .....:     print(chunk)
       .....: 
       Unnamed: 0         0         1         2         3
    0           0  0.469112 -0.282863 -1.509059 -1.135632
    1           1  1.212112 -0.173215  0.119209 -1.044236
    2           2 -0.861849 -2.104569 -0.494929  1.071804
    3           3  0.721555 -0.706771 -1.039575  0.271860
       Unnamed: 0         0         1         2         3
    0           4 -0.424972  0.567020  0.276232 -1.087401
    1           5 -0.673690  0.113648 -1.478427  0.524988
    2           6  0.404705  0.577046 -1.715002 -1.039268
    3           7 -0.370647 -1.157892 -1.344312  0.844885
       Unnamed: 0         0        1         2         3
    0           8  1.075770 -0.10905  1.643563 -1.469388
    1           9  0.357021 -0.67460 -1.776904 -0.968914
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 指定iterator=True 也可以返回一个可迭代对象TextFileReader :
    In [141]: reader = pd.read_table('tmp.sv', sep='|', iterator=True)
    
    In [142]: reader.get_chunk(5)
    Out[142]: 
       Unnamed: 0         0         1         2         3
    0           0  0.469112 -0.282863 -1.509059 -1.135632
    1           1  1.212112 -0.173215  0.119209 -1.044236
    2           2 -0.861849 -2.104569 -0.494929  1.071804
    3           3  0.721555 -0.706771 -1.039575  0.271860
    4           4 -0.424972  0.567020  0.276232 -1.087401
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    • 我需要打开的数据集是个csv文件,大小为3.7G,并且对于数据一无所知,所以首先打开前5行观察数据的类型,列标签等等
    chunks = pd.read_csv('train.csv',iterator = True)
    chunk = chunks.get_chunk(5)
    print chunk
    '''
                 date_time  site_name  posa_continent  user_location_country  
    0  2014-08-11 07:46:59          2               3                     66   
    1  2014-08-11 08:22:12          2               3                     66   
    2  2014-08-11 08:24:33          2               3                     66   
    3  2014-08-09 18:05:16          2               3                     66   
    4  2014-08-09 18:08:18          2               3                     66   
    '''
    博文2:python大规模数据处理技巧之一:数据常用操作

    http://blog.csdn.net/asdfg4381/article/details/51689344

    面对读取上G的数据,Python不能像做简单代码验证那样随意,必须考虑到相应的代码的实现形式将对效率的影响。如下所示,对pandas对象的行计数实现方式不同,运行的效率差别非常大。虽然时间看起来都微不足道,但一旦运行次数达到百万级别时,其运行时间就根本不可能忽略不计了:

    p1

    故接下来的几个文章将会整理下渣渣在关于在大规模数据实践上遇到的一些问题,文章中总结的技巧基本是基于pandas,有错误之处望指正。

    1、外部csv文件读写


    大数据量csv读入到内存


    • 分析思路:数据量非常大时,比如一份银行一个月的流水账单,可能有高达几千万的record。对于一般性能的计算机,有或者是读入到特殊的数据结构中,内存的存储可能就非常吃力了。考虑到我们使用数据的实际情况,并不需要将所有的数据提取出内存。当然读入数据库是件比较明智的做法。若不用数据库呢?可将大文件拆分成小块按块读入后,这样可减少内存的存储与计算资源
    • 注意事项:open(file.csv)与pandas包的pd.read_csv(file.csv ): python32位的话会限制内存,提示太大的数据导致内存错误。解决方法是装python64位。如果嫌python各种包安装过程麻烦,可以直接安装Anaconda2 64位版本
    • 简易使用方法:
        chunker = pd.read_csv(PATH_LOAD, chunksize = CHUNK_SIZE)
    • 1
    • 1
    • 读取需要的列:
        columns = ("date_time",  "user_id")
        chunks_train = pd.read_csv(filename, usecols = columns, chunksize = 100000)
    • 1
    • 2
    • 1
    • 2

    chunker对象指向了多个分块对象,但并没有将实际数据先读入,而是在提取数据时才将数据提取进来。数据的处理和清洗经常使用分块的方式处理,这能大大降低内存的使用量,但相比会更耗时一些

    • 分块读取chunk中的每一行:
        for rawPiece in chunker_rawData:
            current_chunk_size = len(rawPiece.index)   #rawPiece 是dataframe
            for i in range(current_chunk_size ):
                timeFlag = timeShape(rawPiece.ix[i])   #获取第i行的数据
    • 1
    • 2
    • 3
    • 4
    • 1
    • 2
    • 3
    • 4

    将数据存到硬盘


    • 直接写出到磁盘:
        data.to_csv(path_save, index = False, mode = 'w')`
    • 1
    • 1
    • 分块写出到磁盘:
    1. 对于第一个分块使用pandas包的存储IO: 
      • 保留header信息,‘w’模式写入
      • data.to_csv(path_save, index = False, mode = 'w')
    2. 接下的分块写入 
      • 去除header信息,‘a’模式写入,即不删除原文档,接着原文档后继续写
      • data.to_csv(path_save, index = False, header = False, mode = a')
    • 少量的数据写出:

    少量的数据用pickle(cPickle更快)输出和读取,非常方便 ,下面分别是写出和读入

    写出:

        import cPickle as pickle
        def save_trainingSet(fileLoc, X, y):
            pack = [X, y]
            with open(fileLoc, 'w') as f:
                pickle.dump(pack, f)
    • 1
    • 2
    • 3
    • 4
    • 5
    • 1
    • 2
    • 3
    • 4
    • 5

    读入:

        import cPickle as pickle
        def read_trainingSet(fileLoc):
            with open(fileLoc, 'r') as f:
                pack = pickle.load(f)
            return pack[0], pack[1]
    • 1
    • 2
    • 3
    • 4
    • 5
    • 1
    • 2
    • 3
    • 4
    • 5

    高效读取外部csv到python内部的list数据结构


    • 效率低下的方法:使用pd读入需要从pd转换到python本身的数据结构,多此一举
        userList = []
        content = pd.read_csv(filename)
        for i in range(len(content)):
            line = content.ix[i]['id']
            userList.append(line)
    • 1
    • 2
    • 3
    • 4
    • 5
    • 1
    • 2
    • 3
    • 4
    • 5
    • 效率高的方法:直接将外部数据读入进来
        userList = []
        f = open(filename)
        content = f.readlines()
        for line in content:
            line = line.replace('\n', '').split(',')
            userList.append(line)
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    2、数据分析时常用数据结构之间的转化


    数据集的横向与纵向合并


    • 简单地横向合并数据集:
    • 问题分析: 
      • 纵向的合并使用list并不好,因为需要去拆解list的每一个行元素,并用extend去拓展每一行的纵向元素
      • 最好使用dataframe中的concat函数:c = pd.concat([a, b], axis = 1),当axis=0时表示合并行(以行为轴)
        inx1 = DataFrame(np.random.randn(nSample_neg), columns = ['randVal'])
        inx2 = DataFrame(range(nSample_neg), columns = ['inxVal'])
        inx = pd.concat([inx1, inx2], axis = 1)
    • 1
    • 2
    • 3
    • 1
    • 2
    • 3
    • 类似数据库的表合并:join(待完整)
        ret = ret.join(dest_small, on="srch_destination_id", how='left', rsuffix="dest")
    • 1
    • 1
    • 简单纵向合并数据集:
    • 纵向合并数据集可以考虑一下几种方法: 
      • 读取数据为list格式,使用append函数逐行读取
      • 将数据集转换为pandas中的dataframe格式,使用dataframe的merge与concat方法
    • 方法: 
      • 方法一:使用dataframe读入,使用concat把每行并起来
      • 方法二:先使用list读入并起来,最后转换成dataframe
      • 方法三:先使用list读入并起来大块的list,每块list转换成dataframe后用concat合并起来
    • 比较:方法一由于concat的静态性,每次要重新分配资源,故跑起来很慢; 方法二与三:会快很多,但具体没有测试,以下是使用方法三的代码:
        data = []
        cleanedPiece = []
        for i in range(CHUNK_SIZE):
            line = rawPiece.ix[i]
            uid = [line['user_id'], line['item_id'],
                line['behavior_type'], timeFlag]
            cleanedPiece.append(uid)
        cleanedPiece = DataFrame(cleanedPiece, columns = columns)
        data = pd.concat([data, cleanedPiece], axis = 0)



    展开全文
  • 如果你有个5、6 G 大小的文件,想把文件内容读出来做一些处理然后存到另外的文件去,你会使用什么进行处理呢?不用在线等,给几个错误示范:有人用...Python处理大数据的劣势: 1、python线程有gil,通俗说就是多线...

    如果你有个5、6 G 大小的文件,想把文件内容读出来做一些处理然后存到另外的文件去,你会使用什么进行处理呢?不用在线等,给几个错误示范:有人用multiprocessing 处理,但是效率非常低。于是,有人用python处理大文件还是会存在效率上的问题。因为效率只是和预期的时间有关,不会报错,报错代表程序本身出现问题了~

    Python处理大数据的劣势:

    1、python线程有gil,通俗说就是多线程的时候只能在一个核上跑,浪费了多核服务器

    2、python执行效率不高,在处理大数据的时候,效率不高

    3、绝大部分的大公司,用java处理大数据不管是环境也好,积累也好,都会好很多

    Python处理数据的优势(不是处理大数据):

    1、异常快捷的开发速度,代码量巨少

    2、丰富的数据处理包,不管正则也好,html解析啦,xml解析啦,用起来非常方便

    3、内部类型使用成本巨低,不需要额外怎么操作(java,c++用个map都很费劲)

    4、公司中,很大量的数据处理工作工作是不需要面对非常大的数据的

    5、巨大的数据不是语言所能解决的,需要处理数据的框架(hadoop, mpi。。。。)虽然小众,但是python还是有处理大数据的框架的,或者一些框架也支持python

    6、编码问题处理起来太太太方便了

    结论:

    1、python可以处理大数据

    2、python处理大数据不一定是最优的选择

    3. python和其他语言(公司主推的方式)并行使用是非常不错的选择

    4. 因为开发速度,你如果经常处理数据,而且喜欢linux终端,而且经常处理不大的数据(100m一下),最好还是熟悉一下python

    为什么用python处理大文件总有效率问题?

    如果工作需要,立刻处理一个大文件,你需要注意两点:

    一、大型文件的读取效率

    面对100w行的大型数据,经过测试各种文件读取方式,得出结论:

    with open(filename,‘rb’) as f:

    for fLine in f:

    pass

    方式最快,100w行全遍历2.7秒。基本满足中大型文件处理效率需求。如果rb改为r,慢6倍。但是此方式处理文件,fLine为bytes类型。但是python自行断行,仍旧能很好的以行为单位处理读取内容。

    二、文本处理效率问题

    这里举例ascii定长文件,因为这个也并不是分隔符文件,所以打算采用列表操作实现数据分割。但是问题是处理20w条数据,时间急剧上升到12s。本以为是byte.decode增加了时间。遂去除decode全程bytes处理。但是发现效率还是很差。

    最后用最简单方式测试,首次运行,最简单方式也要7.5秒100w次。

    那么关于python处理大文件的技巧,从网络整理三点:列表、文件属性、字典三个点来看看。

    1.列表处理

    def fun(x):尽量选择集合、字典数据类型,千万不要选择列表,列表的查询速度会超级慢,同样的,在已经使用集合或字典的情况下,不要再转化成列表进行操作,比如:

    values_count = 0
    
    

    不要用这种的

    
    if values in dict.values():
    
    values_count += 1
    
    

    尽量用这种的

    if keys,values in dict:
    
    values_count += 1
    
    

    后者的速度会比前者快好多好多。

    2、对于文件属性

    如果遇到某个文件,其中有属性相同的,但又不能进行去重操作,没有办法使用集合或字典时,可以增加属性,比如将原数据重新映射出一列计数属性,让每一条属性具有唯一性,从而可以用字典或集合处理:

    return '(' + str(x) + ', 1)'
    
    list(map(fun,[1,2,3]))
    
    

    使用map函数将多个相同属性增加不同项。

    3、对于字典

    多使用iteritems()少使用items(),iteritems()返回迭代器:

    >>> d = {'a':1,'b':2}
    
    >>> for i in d.items() :
    
    ('a',1)
    
    ('b',2)
    
    >>> for k,v in d.iteritems() :
    
    ... print k,v
    
    ('a',1)
    
    ('b',2)
    
    

    字典的items函数返回的是键值对的元组的列表,而iteritems使用的是键值对的generator,items当使用时会调用整个列表 iteritems当使用时只会调用值。

    对Python感兴趣或者是正在学习的小伙伴,可以加入我们的Python学习扣qun:784758214,看看前辈们是如何学习的!从基础的python脚本到web开发、爬虫、django、数据挖掘等,零基础到项目实战的资料都有整理。送给每一位python的小伙伴!分享一些学习的方法和需要注意的小细节,点击加入我们的 python学习者聚集地

    除了以下5个python使用模块,你还有什么技巧解决大文件运行效率的问题吗?

    1. 读写文件技术,今后会用到测试数据的参数化和测试报告写作功能中~

    2. 数据处理技术,今后测试脚本的测试数据处理过程可以用到~

    3. 数据统计分析技术,今后会在测试结果分析中用到

    4. 图表展示技术,在今后的测试框架中相关测试报告会用到

    5. 程序自动触发技术,可用于测试脚本程序的自动执行。

    展开全文
  • 今天为大家带来的内容是如何用Python处理大数据?3个小技巧助你提升效率(建议收藏)本文具有不错的参考意义,希望能够帮助到大家! 首先,提出个问题:如果你有个5、6 G 大小的文件,想把文件内容读出来做一些处理...

    今天为大家带来的内容是如何用Python处理大数据?3个小技巧助你提升效率(建议收藏)本文具有不错的参考意义,希望能够帮助到大家!

    首先,提出个问题:如果你有个5、6 G 大小的文件,想把文件内容读出来做一些处理然后存到另外的文件去,你会使用什么进行处理呢?

    解答:不用在线等,给几个错误示范:有人用multiprocessing 处理,但是效率非常低。于是,有人用python处理大文件还是会存在效率上的问题。因为效率只是和预期的时间有关,不会报错,报错代表程序本身出现问题了~

    所以,为什么用python处理大文件总有效率问题?

    如果工作需要,立刻处理一个大文件,你需要注意两点:

    1、大型文件的读取效率

    面对100w行的大型数据,经过测试各种文件读取方式,得出结论:

    with open(filename,"rb") as f:
     for fLine in f:
     pass
    

    方式最快,100w行全遍历2.7秒。

    基本满足中大型文件处理效率需求。如果rb改为r,慢6倍。但是此方式处理文件,fLine为bytes类型。但是python自行断行,仍旧能很好的以行为单位处理读取内容。

    2、文本处理效率问题

    这里举例ascii定长文件,因为这个也并不是分隔符文件,所以打算采用列表操作实现数据分割。但是问题是处理20w条数据,时间急剧上升到12s。本以为是byte.decode增加了时间。遂去除decode全程bytes处理。但是发现效率还是很差。

    那么关于python处理大文件的技巧,从网络整理三点:列表、文件属性、字典三个点来看看。

    一. 列表处理

    def fun(x):尽量选择集合、字典数据类型,千万不要选择列表,列表的查询速度会超级慢,同样的,在已经使用集合或字典的情况下,不要再转化成列表进行操作,比如:

    如何用Python处理大数据?3个小技巧助你提升效率(建议收藏)

     

    后者的速度会比前者快好多好多。

    二. 对于文件属性

    如果遇到某个文件,其中有属性相同的,但又不能进行去重操作,没有办法使用集合或字典时,可以增加属性,比如将原数据重新映射出一列计数属性,让每一条属性具有唯一性,从而可以用字典或集合处理:

    return '(' + str(x) + ', 1)'
    list(map(fun,[1,2,3]))
    

    使用map函数将多个相同属性增加不同项。

    三. 对于字典

    多使用iteritems()少使用items(),iteritems()返回迭代器:

    如何用Python处理大数据?3个小技巧助你提升效率(建议收藏)

     

    字典的items函数返回的是键值对的元组的列表,而iteritems使用的是键值对的generator,items当使用时会调用整个列表 iteritems当使用时只会调用值。

    除了以下5个python使用模块,你还有什么技巧解决大文件运行效率的问题吗?深入了解更多Python实用模块,快速提升工作效率~

    如何用Python处理大数据?3个小技巧助你提升效率(建议收藏)

     

    以上就是本文的全部内容啦!

    python交流群:877562786(群里含大量学习资料,面试宝典等)

    展开全文
  • 未来大数据产业发展的趋势之一:与云计算、人工智能等前沿创新技术深度融合。大数据、云计算、人工智能等前沿技术的产生和发展均来自社会生产方式的进步和信息技术产业的发展。而前沿技术的彼此融合将能实现超大规模...
  • 如果你有个5、6 G 大小的文件,想把文件内容读出来做一些处理然后存到另外的文件去,你会使用什么进行处理呢?不用在线等,给几个错误示范:有人用multiprocessing 处理,但是效率非常低。于是,有人用python处理大...
  • python 大数据入门教程

    2018-12-07 17:35:38
    Python大数据行业非常火爆近两年,as a pythonic,所以也得涉足下大数据分析,下面就聊聊它们。 Python数据分析与挖掘技术概述 所谓数据分析,即对已知的数据进行分析,然后提取出一些有价值的信息,比如统计...
  • 大数据文本分类、聚类对大数据文本进行分类聚类1.获取数据-用爬虫爬取微薄数据。2.分词-使用jieba进行中文分词。3.使用IF_IDF把文本向量化-分词后,使用IF_IDF把文本向量化,每个文本对应一个向量 python有可以直接...
  • 大数据与人工智能时代,掌握Python基础后,我们可以选择数据分析方向、人工智能方向、全栈开发方向...如果想要追赶 Python 的热潮,应该如何学习呢?除了自学之外,多数人都会选择在线课程作为辅助。选择课程的衡量...
  • 1.Python处理的各种类型的数据,通过内置数据结构如列表、字典等在计算机内存中进行处理加工,最后必须要存入外部存储器中永久保存。 2.文件是一个存储在辅助存储器上的数据序列; 文件是常用的存储形式; 文件可以...
  • Python大数据处理方案

    2018-03-26 21:30:37
    Mysql SQLyog导入导出csv文件SQLyog 导出表中数据存为csv文件1. 选择数据库表 --&gt; 右击属性 --&gt; 备份/导出 --&gt; 导出表数据作为 --&gt; 选择cvs --&... 选择下面的“更改” --&...
  • 深度学习这是当今的热门话题,坚定地投入到人工智能,大数据和分析等领域的广泛行业。目前,Google正在使用语音和图像识别算法深度学习,而Netflix和Amazon正在使用它来了解客户的行为。事实上,你不会相信,但是...
  • 版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/StoryMonster/article/details/53933337 ...
  • 未来大数据产业发展的趋势之一:与云计算、人工智能等前沿创新技术深度融合。大数据、云计算、人工智能等前沿技术的产生和发展均来自社会生产方式的进步和信息技术产业的发展。而前沿技术的彼此融合将能实现超大规模...
  • 前言 相信大家都参加过很多的...你想要的各大厂常见面试这里都有,包括:java、Python大数据、数据库、微服务等等。 由于资料内容太多了,博主只截取了部分部分面试专题和资料,全部的面试文档可以查看文末免...
  • 大数据入门——文本情感分类(python实现)文本情感分类总思路详细步骤一、导入数据二、分词三、数据清洗四、构造特征五、分割训练集、测试集六、训练数据svm支持向量机KNN逻辑回归贝叶斯随机森林七、预测数据八、...
1 2 3 4 5 ... 20
收藏数 22,792
精华内容 9,116
关键字:

python 处理大数据文本