精华内容
下载资源
问答
  • Python爬虫系列:爬取小说并写入txt文件

    万次阅读 多人点赞 2017-07-13 17:14:51
    Python爬虫系列——爬取小说并写入txt文件 文章介绍了如何从网站中爬取小说并写入txt文件中,实现了单章节写取,整本写取,多线程多本写取。爬虫使用的python版本为python3,有些系统使用python指令运行本脚本,可能...

    Python爬虫系列

    ——爬取小说并写入txt文件


        本教程使用的单线程单本下载小说代码会不定期维护,最新源码及相关教程以CSDN博客为主,教程所说的多线程多本由于博主时间有限,暂时不做维护,仅作为一个教程供大家参考,感兴趣的朋友可以在此基础上做一个UI,便于下载;单线程单本代码见文末或码云>>get_one_txt.py文件,以下是维护日志:

    • 2019.02.14:单线程单本源码可用,修改爬取规则已解决部分小说无法下载。

        文章介绍了如何从网站中爬取小说并写入txt文件中,实现了单章节写取,整本写取,多线程多本写取。爬虫使用的python版本为python3,有些系统使用python指令运行本脚本,可能出现错误,此时可以试一试使用python3运行本脚本。
        本文是一个教程,一步步介绍了如何爬取批量小说内容以及存储这是txt文件中,以下是项目源码地址。

        爬虫源码地址:https://git.oschina.net/XPSWorld/get_txt.git

        博客文章地址:https://blog.csdn.net/baidu_26678247/article/details/75086587

         C#版带界面爬虫说明:https://blog.csdn.net/baidu_26678247/article/details/100174059

         C#版带界面爬虫源码:https://gitee.com/XPSWorld/sworld_reading

    1.使用到库文件

    • requests:用于get请求
    • threading:多线程
    • bs4:网页解析
    • re:正则表达式
    • os:系统相关操作
    • time:获取时间

        以下是整个爬虫所用的库文件,如若没有对应库文件,可以使用pip获取,例如获取threading库文件:pip install threading

    import  requests
    import threading
    from bs4 import BeautifulSoup
    import re
    import os
    import time
    



    2.对网页文件结构进行分析(PS:浏览器使用的是谷歌浏览器)

        通过对 http://www.qu.la/ 的文件结构进行分析,知道了每一本小说的目录地址为该地址加上book/,再加上对应的小说编号,如编号为1的小说地址为http://www.qu.la/book/1/,在浏览器打开该网址,就可以看到如下类似的界面
    显示界面
        以此类推就可以知道每一本的小说地址。


    3.获取网页的请求头文件

        我们以编号为1的小说地址为例(http://www.qu.la/book/1/),打开谷歌的开发者工具,选择Network,会出现如下界面,如果没有对应的列表信息,刷新一下网页即可。
    这里写图片描述



        然后点击1/,出现以下信息:
    这里写图片描述

        我们需要的是第二个方框中的内容(Request Headers),将该目录下的信息取出,存放到字典中,其中每一个项所代表的意义如果感兴趣可自行网上搜索(HTTP Header 详解)。

    #请求头字典
    req_header={
    'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
    'Accept-Encoding':'gzip, deflate',
    'Accept-Language':'zh-CN,zh;q=0.8',
    'Cookie':'__cfduid=d577ccecf4016421b5e2375c5b446d74c1499765327; UM_distinctid=15d30fac6beb80-0bdcc291c89c17-9383666-13c680-15d30fac6bfa28; CNZZDATA1261736110=1277741675-1499763139-null%7C1499763139; tanwanhf_9821=1; Hm_lvt_5ee23c2731c7127c7ad800272fdd85ba=1499612614,1499672399,1499761334,1499765328; Hm_lpvt_5ee23c2731c7127c7ad800272fdd85ba=1499765328; tanwanpf_9817=1; bdshare_firstime=1499765328088',
    'Host':'www.qu.la',
    'Proxy-Connection':'keep-alive',
    'Referer':'http://www.qu.la/book/1265/765108.html',
    'Upgrade-Insecure-Requests':'1',
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.104 Safari/537.36'
    }
    



    4.分析每章小说网页结构

        每一本小说多有对应的章节网页,也就说每一张都有对应的网页,我们以编号为1的小说中任意章节为例,其地址信息为http://www.qu.la/book/1/260824.html,其中“260824.html”就是该章节的网页名称,点击开发者工具中的 Element 选项,以下是对应的截图信息,通过分析,小说章节信息的路径为:#wrapper .content_read .box_con (PS:其中“#wrapper”号表示id为wrapper的项,“.content_read”表示class为content_read的项,按照此顺序放在一起就表示id为wrapper的项中的class为content_read的项中的class为con_box的相关信息,三者为树形关系。)
        在该路径下,我们需要的信息主要有三项,以下是对应的class内容以及对应的说明:

    • bookname:可获取章节名称
    • content:可获取章节内容
    • bottom2:可获取下一章节地址

    这里写图片描述


    5.获取单独一章内容

        对于BeautifulSoup不是特别了解的,可以先阅读以下几篇文章:

        以下是获取单章章节内容的部分代码,需将文章上所述的库文件以及请求头文件粘贴方可运行以下代码(PS【重要】:python想要使用汉字,需要在脚本最前面添加 #coding:utf-8,汉字使用的编码为utf-8,否则会出现错误):

    req_url_base='http://www.qu.la/book/'           #小说主地址
    req_url=req_url_base+"1/"                       #单独一本小说地址
    txt_section='260824.html'                       #某一章页面地址
    
    #请求当前章节页面  params为请求参数
    r=requests.get(req_url+str(txt_section),params=req_header) 
    #soup转换
    soup=BeautifulSoup(r.text,"html.parser")    
    #获取章节名称                                    
    section_name=soup.select('#wrapper .content_read .box_con .bookname h1')[0]        
    #获取章节文本
    section_text=soup.select('#wrapper .content_read .box_con #content')[0].text             
    for ss in section_text.select("script"):                #删除无用项
        ss.decompose()
    #按照指定格式替换章节内容,运用正则表达式
    section_text=re.sub( '\s+', '\r\n\t', section_text.text).strip('\r\n')          
    
    print('章节名:'+section_name)
    print("章节内容:\n"+section_text)
    

    运行效果截图:
    文本输出


    6.将获取的文本信息写入txt文件中

        在实际操作之前,如果大家对于文件操作以及编码转换不是很了解的,可以先看看以下两篇文章:

        以下是相关源码以及注释(PS:在原有代码的基础上添加即可):

    fo = open('1.txt', "ab+")         #打开小说文件
    # 以二进制写入章节题目 需要转换为utf-8编码,否则会出现乱码
    fo.write(('\r' + section_name + '\r\n').encode('UTF-8'))  
    # 以二进制写入章节内容
    fo.write((section_text).encode('UTF-8'))  
    fo.close()        #关闭小说文件
    



    7.获取整本小说

        通过前面几个步骤,我们知道了如何获取单章小说相关信息写入txt中,接下来获取整本小说内容就是在其基础上进行改进的,我们将通过一个函数来实现获取整本内容,以下是函数代码:

    #小说下载函数
    #id:小说编号
    #txt字典项介绍
    # title:小说题目
    # first_page:第一章页面
    # txt_section:章节地址
    # section_name:章节名称
    # section_text:章节正文
    # section_ct:章节页数
    def get_txt(txt_id):
        txt={}
        txt['title']=''
        txt['id']=str(txt_id)
        try:
            print("请输入需要下载的小说编号:")
            txt['id']=input()
            req_url=req_url_base+ txt['id']+'/'                        #根据小说编号获取小说URL
            print("小说编号:"+txt['id'])
            res=requests.get(req_url,params=req_header)             #获取小说目录界面
            soups=BeautifulSoup(res.text,"html.parser")           #soup转化
            #获取小说题目
            txt['title']=soups.select('#wrapper .box_con #maininfo #info h1')[0].text     
            txt['author']=soups.select('#wrapper .box_con #maininfo #info p')
            #获取小说最近更新时间
            txt['update']=txt['author'][2].text                                                       
            #获取最近更新章节名称
            txt['lately'] = txt['author'][3].text                                                     
            #获取小说作者
            txt['author']=txt['author'][0].text                                                       
            #获取小说简介
            txt['intro']=soups.select('#wrapper .box_con #maininfo #intro')[0].text.strip()            
            print("编号:"+'{0:0>8}   '.format(txt['id'])+  "小说名:《"+txt['title']+"》  开始下载。")
            print("正在寻找第一章页面。。。")
            #获取小说所有章节信息
            first_page=soups.select('#wrapper .box_con #list dl dd a')                          
            #获取小说总章页面数
            section_ct=len(first_page)                                                                  
            #获取小说第一章页面地址
            first_page = first_page[0]['href'].split('/')[3]                                        
            print("小说章节页数:"+str(section_ct))
            print("第一章地址寻找成功:"+ first_page)
            #设置现在下载小说章节页面
            txt_section=first_page                                                                  
            #打开小说文件写入小说相关信息
            fo = open('{0:0>8}-{1}.txt.download'.format(txt['id'],txt['title']), "ab+")         
            fo.write((txt['title']+"\r\n").encode('UTF-8'))
            fo.write((txt['author'] + "\r\n").encode('UTF-8'))
            fo.write((txt['update'] + "\r\n").encode('UTF-8'))
            fo.write((txt['lately'] + "\r\n").encode('UTF-8'))
            fo.write(("*******简介*******\r\n").encode('UTF-8'))
            fo.write(("\t"+txt['intro'] + "\r\n").encode('UTF-8'))
            fo.write(("******************\r\n").encode('UTF-8'))
            #进入循环,写入每章内容
            while(1):
                try:
    	            #请求当前章节页面
                    r=requests.get(req_url+str(txt_section),params=req_header)                      
                    #soup转换
                    soup=BeautifulSoup(r.text,"html.parser")       
                    #获取章节名称                                 
                    section_name=soup.select('#wrapper .content_read .box_con .bookname h1')[0]
                    section_text=soup.select('#wrapper .content_read .box_con #content')[0]
                    for ss in section_text.select("script"):   #删除无用项
                        ss.decompose()
                    #获取章节文本
                    section_text=re.sub( '\s+', '\r\n\t', section_text.text).strip('\r\n')#
                    #获取下一章地址
                    txt_section=soup.select('#wrapper .content_read .box_con .bottem2 #A3')[0]['href']       
                    #判断是否最后一章,当为最后一章时,会跳转至目录地址,最后一章则跳出循环               
                    if(txt_section=='./'):                                                          
                        print("编号:"+'{0:0>8}   '.format(txt['id'])+  "小说名:《"+txt['title']+"》 下载完成")
                        break
                    #以二进制写入章节题目
                    fo.write(('\r'+section_name.text+'\r\n').encode('UTF-8'))                                
                    #以二进制写入章节内容
                    fo.write((section_text).encode('UTF-8'))                        
                    print(txt['title']+' 章节:'+section_name.text+'     已下载')
                    #print(section_text.text.encode('UTF-8'))
                except:
                    print("编号:"+'{0:0>8}   '.format(txt['id'])+  "小说名:《"+txt['title']+"》 章节下载失败,正在重新下载。")
            fo.close()
            os.rename('{0:0>8}-{1}.txt.download'.format(txt['id'],txt['title']), '{0:0>8}-{1}.txt'.format(txt['id'],txt['title']))
        except:     #出现错误会将错误信息写入dowload.log文件,同时答应出来
            fo_err = open('dowload.log', "ab+")
            try:
                fo_err.write(('['+time.strftime('%Y-%m-%d %X', time.localtime())+"]:编号:" + '{0:0>8}   '.format(txt['id']) + "小说名:《" + txt['title'] + "》 下载失败。\r\n").encode('UTF-8'))
                print('['+time.strftime('%Y-%m-%d %X', time.localtime())+"]:编号:"+'{0:0>8}   '.format(txt['id'])+  "小说名:《"+txt['title']+"》 下载失败。")
                os.rename('{0:0>8}'.format(txt['id']) + '-' + txt['title'] + '.txt.download',
                      '{0:0>8}'.format(txt['id']) + '-' + txt['title'] + '.txt.error')
            except:     
                fo_err.write(('['+time.strftime('%Y-%m-%d %X', time.localtime())+"]:编号:"+'{0:0>8}   '.format(txt['id'])+"下载失败。\r\n").encode('UTF-8'))
                print('['+time.strftime('%Y-%m-%d %X', time.localtime())+"]:编号:"+'{0:0>8}   '.format(txt['id'])+"下载失败。")
            finally: #关闭文件
                fo_err.close()
    

        如果有需要爬取的相关小说,只需要在该网站找到小说编号,然后调用该函数就可以将小说下载至本电脑,如需下载编号为6666的小说,则调用get_txt(6666)即可,在下载过程中,文件后缀为“.txt.download”,下载完成后会将文件后缀变为“.txt”。
    运行效果
    运行效果


    8.多线程爬取多本小说

        同样的,在此之前如果对于python线程不了解的可以阅读以下文章:

        关于多线程的代码就不过多介绍了,在项目源码中会有相关的使用方法。(PS:通过实验,每次同步下载100本小说最好,太多的话进程可能会被杀死)


    9.最终效果

        最终的源码实现如下效果:

    • 每次同步爬取100本小说
    • 会生成一个关于小说的介绍文档,文档介绍了每次爬取的100本小说
    • 显示对应进度信息
    • 小说还未下载完文件后缀为“.txt.download”,下载完成后会将文件后缀变为“.txt”

    以下是运行效果图:
    运行效果图


    运行结果图


        在运行结果图中,标号为1的部分是已经爬取完成的小说;编号为2的为还在下载的小说;编号为3的文件是下载错误日志,当不存在相关编号小说,则会记录在该文件中,下图为文件内容;编号为4的为每100本小说的简介,在我们通过该脚本,就可以知道所爬取的小说有哪些,通过然后通过编号就可以找到对应小说,下图同样展示其相关内容。

    download.log文件内容:
    download.log文件内容

    小说简介文件内容:
    小说简介文件内容

    10.其他(教程源码)

        鉴于有朋友说提供的项目源码(多线程多本)与教程(单线程单本)不符,所将以上教程中单本小说下载的源码贴上,大家可以直接复制运行。

    #coding:utf-8
    import  requests
    import threading
    from bs4 import BeautifulSoup
    import re
    import os
    import time
    import sys
    req_header={
    'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
    'Accept-Encoding':'gzip, deflate',
    'Accept-Language':'zh-CN,zh;q=0.8',
    'Cookie':'__cfduid=d577ccecf4016421b5e2375c5b446d74c1499765327; UM_distinctid=15d30fac6beb80-0bdcc291c89c17-9383666-13c680-15d30fac6bfa28; CNZZDATA1261736110=1277741675-1499763139-null%7C1499763139; tanwanhf_9821=1; Hm_lvt_5ee23c2731c7127c7ad800272fdd85ba=1499612614,1499672399,1499761334,1499765328; Hm_lpvt_5ee23c2731c7127c7ad800272fdd85ba=1499765328; tanwanpf_9817=1; bdshare_firstime=1499765328088',
    'Host':'www.qu.la',
    'Proxy-Connection':'keep-alive',
    'Referer':'http://www.qu.la/book/',
    'Upgrade-Insecure-Requests':'1',
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.104 Safari/537.36'
    }
    
    
    req_url_base='http://www.qu.la/book/'           #小说主地址
    
    #小说下载函数
    #txt_id:小说编号
    #txt字典项介绍
    #id:小说编号
    # title:小说题目
    # first_page:第一章页面
    # txt_section:章节地址
    # section_name:章节名称
    # section_text:章节正文
    # section_ct:章节页数
    def get_txt(txt_id):
        txt={}
        txt['title']=''
        txt['id']=str(txt_id)
        try:
            #print("请输入需要下载的小说编号:")
            #txt['id']=input()
            req_url=req_url_base+ txt['id']+'/'                        #根据小说编号获取小说URL
            print("小说编号:"+txt['id'])
            res=requests.get(req_url,params=req_header)             #获取小说目录界面
            soups=BeautifulSoup(res.text,"html.parser")           #soup转化
            #获取小说题目
            txt['title']=soups.select('#wrapper .box_con #maininfo #info h1')[0].text
            txt['author']=soups.select('#wrapper .box_con #maininfo #info p')
            #获取小说最近更新时间
            txt['update']=txt['author'][2].text
            #获取最近更新章节名称
            txt['lately'] = txt['author'][3].text
            #获取小说作者
            txt['author']=txt['author'][0].text
            #获取小说简介
            txt['intro']=soups.select('#wrapper .box_con #maininfo #intro')[0].text.strip()
            print("编号:"+'{0:0>8}   '.format(txt['id'])+  "小说名:《"+txt['title']+"》  开始下载。")
            print("正在获取所有章节地址。。。")
            #获取小说所有章节信息
            all_page_address=soups.select('#wrapper .box_con #list dl dd a')
            #获取小说总章页面数
            section_ct=len(all_page_address)
            print("小说章节页数:"+str(section_ct))
            #打开小说文件写入小说相关信息
            fo = open('{0:0>8}-{1}.txt.download'.format(txt['id'],txt['title']), "ab+")
            fo.write((txt['title']+"\r\n").encode('UTF-8'))
            fo.write((txt['author'] + "\r\n").encode('UTF-8'))
            fo.write((txt['update'] + "\r\n").encode('UTF-8'))
            fo.write((txt['lately'] + "\r\n").encode('UTF-8'))
            fo.write(("*******简介*******\r\n").encode('UTF-8'))
            fo.write(("\t"+txt['intro'] + "\r\n").encode('UTF-8'))
            fo.write(("******************\r\n").encode('UTF-8'))
            #获取每一章节信息
            for one_page_info in all_page_address:
                try:
                    #请求当前章节页面
                    r=requests.get(req_url+str(one_page_info['href']),params=req_header)
                    #soup转换
                    soup=BeautifulSoup(r.text,"html.parser")
                    #获取章节名称
                    section_name=soup.select('#wrapper .content_read .box_con .bookname h1')[0]
                    section_text=soup.select('#wrapper .content_read .box_con #content')[0]
                    for ss in section_text.select("script"):   #删除无用项
                        ss.decompose()
                    #获取章节文本
                    section_text=re.sub( '\s+', '\r\n\t', section_text.text).strip('\r\n')#
                    #以二进制写入章节题目
                    fo.write(('\r'+section_name.text+'\r\n').encode('UTF-8'))
                    #以二进制写入章节内容
                    fo.write((section_text).encode('UTF-8'))
                    print(txt['title']+' 章节:'+section_name.text+'     已下载')
                    #print(section_text.text.encode('UTF-8'))
                except:
                    print("编号:"+'{0:0>8}   '.format(txt['id'])+  "小说名:《"+txt['title']+"》 章节下载失败,正在重新下载。")
            fo.close()
            os.rename('{0:0>8}-{1}.txt.download'.format(txt['id'],txt['title']), '{0:0>8}-{1}.txt'.format(txt['id'],txt['title']))
        except:     #出现错误会将错误信息写入dowload.log文件,同时答应出来
            fo_err = open('dowload.log', "ab+")
            try:
                fo_err.write(('['+time.strftime('%Y-%m-%d %X', time.localtime())+"]:编号:" + '{0:0>8}   '.format(txt['id']) + "小说名:《" + txt['title'] + "》 下载失败。\r\n").encode('UTF-8'))
                print('['+time.strftime('%Y-%m-%d %X', time.localtime())+"]:编号:"+'{0:0>8}   '.format(txt['id'])+  "小说名:《"+txt['title']+"》 下载失败。")
                os.rename('{0:0>8}'.format(txt['id']) + '-' + txt['title'] + '.txt.download',
                      '{0:0>8}'.format(txt['id']) + '-' + txt['title'] + '.txt.error')
            except:
                fo_err.write(('['+time.strftime('%Y-%m-%d %X', time.localtime())+"]:编号:"+'{0:0>8}   '.format(txt['id'])+"下载失败。\r\n").encode('UTF-8'))
                print('['+time.strftime('%Y-%m-%d %X', time.localtime())+"]:编号:"+'{0:0>8}   '.format(txt['id'])+"下载失败。")
            finally: #关闭文件
                fo_err.close()
    
    #此处为需要下载小说的编号,编号获取方法在上文中已经讲过。
    get_txt(87176)
    

        文章有那块不对的地方,希望大家帮忙指正改进。

    展开全文
  • Python3读取、写入、追加写入Excel文件

    万次阅读 多人点赞 2018-08-21 18:52:42
    写入:xlwt 修改(追加写入):xlutils 2.操作xlsx格式的表格文件: 读取/写入:openpyxl 二、实现代码 1.操作xls格式的表格文件: # coding=UTF-8 import xlrd import xlwt from xlutils.copy import copy ...

    一、需要用到的库:

    1.操作xls格式的表格文件:

    读取:xlrd

    写入:xlwt

    修改(追加写入):xlutils

    2.操作xlsx格式的表格文件:

    读取/写入:openpyxl

    二、实现代码

    1.操作xls格式的表格文件:

    # coding=UTF-8
    import xlrd
    import xlwt
    from xlutils.copy import copy
    
    
    def write_excel_xls(path, sheet_name, value):
        index = len(value)  # 获取需要写入数据的行数
        workbook = xlwt.Workbook()  # 新建一个工作簿
        sheet = workbook.add_sheet(sheet_name)  # 在工作簿中新建一个表格
        for i in range(0, index):
            for j in range(0, len(value[i])):
                sheet.write(i, j, value[i][j])  # 像表格中写入数据(对应的行和列)
        workbook.save(path)  # 保存工作簿
        print("xls格式表格写入数据成功!")
    
    
    def write_excel_xls_append(path, value):
        index = len(value)  # 获取需要写入数据的行数
        workbook = xlrd.open_workbook(path)  # 打开工作簿
        sheets = workbook.sheet_names()  # 获取工作簿中的所有表格
        worksheet = workbook.sheet_by_name(sheets[0])  # 获取工作簿中所有表格中的的第一个表格
        rows_old = worksheet.nrows  # 获取表格中已存在的数据的行数
        new_workbook = copy(workbook)  # 将xlrd对象拷贝转化为xlwt对象
        new_worksheet = new_workbook.get_sheet(0)  # 获取转化后工作簿中的第一个表格
        for i in range(0, index):
            for j in range(0, len(value[i])):
                new_worksheet.write(i+rows_old, j, value[i][j])  # 追加写入数据,注意是从i+rows_old行开始写入
        new_workbook.save(path)  # 保存工作簿
        print("xls格式表格【追加】写入数据成功!")
    
    
    def read_excel_xls(path):
        workbook = xlrd.open_workbook(path)  # 打开工作簿
        sheets = workbook.sheet_names()  # 获取工作簿中的所有表格
        worksheet = workbook.sheet_by_name(sheets[0])  # 获取工作簿中所有表格中的的第一个表格
        for i in range(0, worksheet.nrows):
            for j in range(0, worksheet.ncols):
                print(worksheet.cell_value(i, j), "\t", end="")  # 逐行逐列读取数据
            print()
    
    
    book_name_xls = 'xls格式测试工作簿.xls'
    
    sheet_name_xls = 'xls格式测试表'
    
    value_title = [["姓名", "性别", "年龄", "城市", "职业"],]
    
    value1 = [["张三", "男", "19", "杭州", "研发工程师"],
              ["李四", "男", "22", "北京", "医生"],
              ["王五", "女", "33", "珠海", "出租车司机"],]
    
    value2 = [["Tom", "男", "21", "西安", "测试工程师"],
              ["Jones", "女", "34", "上海", "产品经理"],
              ["Cat", "女", "56", "上海", "教师"],]
    
    
    write_excel_xls(book_name_xls, sheet_name_xls, value_title)
    write_excel_xls_append(book_name_xls, value1)
    write_excel_xls_append(book_name_xls, value2)
    read_excel_xls(book_name_xls)

    2.操作xlsx格式的表格文件:

    # coding=UTF-8
    import openpyxl
    
    
    def write_excel_xlsx(path, sheet_name, value):
        index = len(value)
        workbook = openpyxl.Workbook()
        sheet = workbook.active
        sheet.title = sheet_name
        for i in range(0, index):
            for j in range(0, len(value[i])):
                sheet.cell(row=i+1, column=j+1, value=str(value[i][j]))
        workbook.save(path)
        print("xlsx格式表格写入数据成功!")
    
    
    def read_excel_xlsx(path, sheet_name):
        workbook = openpyxl.load_workbook(path)
        # sheet = wb.get_sheet_by_name(sheet_name)这种方式已经弃用,不建议使用
        sheet = workbook[sheet_name]
        for row in sheet.rows:
            for cell in row:
                print(cell.value, "\t", end="")
            print()
    
    
    book_name_xlsx = 'xlsx格式测试工作簿.xlsx'
    
    sheet_name_xlsx = 'xlsx格式测试表'
    
    value3 = [["姓名", "性别", "年龄", "城市", "职业"],
              ["111", "女", "66", "石家庄", "运维工程师"],
              ["222", "男", "55", "南京", "饭店老板"],
              ["333", "女", "27", "苏州", "保安"],]
    
    
    write_excel_xlsx(book_name_xlsx, sheet_name_xlsx, value3)
    read_excel_xlsx(book_name_xlsx, sheet_name_xlsx)
    

    三、运行结果

    展开全文
  • Java读取txt文件和写入txt文件

    万次阅读 多人点赞 2016-05-25 23:16:26
    原文: Java读取txt文件和写入txt文件写Java程序时经常碰到要读如txt或写入txt文件的情况,但是由于要定义好多变量,经常记不住,每次都要查,特此整理一下,简单易用,方便好懂! package edu.thu.keyword.test; ...

    2018-10-19更新

    网友推荐更加简洁的写法,修改之后的代码;
    项目实用优化,增加java7中的try-with-resources写法

    package com.nickwong.code;
    
    import java.io.*;
    
    /**
     * Created by Nickwong on 31/07/2018.
     * 根据1-8楼的建议,优化了代码
     */
    public class ReadTxt {
    
        public static void main(String args[]) {
            readFile();
            writeFile();
        }
    
        /**
         * 读入TXT文件
         */
        public static void readFile() {
            String pathname = "input.txt"; // 绝对路径或相对路径都可以,写入文件时演示相对路径,读取以上路径的input.txt文件
            //防止文件建立或读取失败,用catch捕捉错误并打印,也可以throw;
            //不关闭文件会导致资源的泄露,读写文件都同理
            //Java7的try-with-resources可以优雅关闭文件,异常时自动关闭文件;详细解读https://stackoverflow.com/a/12665271
            try (FileReader reader = new FileReader(pathname);
                 BufferedReader br = new BufferedReader(reader) // 建立一个对象,它把文件内容转成计算机能读懂的语言
            ) {
                String line;
                //网友推荐更加简洁的写法
                while ((line = br.readLine()) != null) {
                    // 一次读入一行数据
                    System.out.println(line);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
        /**
         * 写入TXT文件
         */
        public static void writeFile() {
            try {
                File writeName = new File("output.txt"); // 相对路径,如果没有则要建立一个新的output.txt文件
                writeName.createNewFile(); // 创建新文件,有同名的文件的话直接覆盖
                try (FileWriter writer = new FileWriter(writeName);
                     BufferedWriter out = new BufferedWriter(writer)
                ) {
                    out.write("我会写入文件啦1\r\n"); // \r\n即为换行
                    out.write("我会写入文件啦2\r\n"); // \r\n即为换行
                    out.flush(); // 把缓存区内容压入文件
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    
    
    

    ##参考原文: Java读取txt文件和写入txt文件##

    写Java程序时经常碰到要读如txt或写入txt文件的情况,但是由于要定义好多变量,经常记不住,每次都要查,特此整理一下,简单易用,方便好懂!

        package edu.thu.keyword.test;  
          
        import java.io.File;  
        import java.io.InputStreamReader;  
        import java.io.BufferedReader;  
        import java.io.BufferedWriter;  
        import java.io.FileInputStream;  
        import java.io.FileWriter;  
          
        public class cin_txt {  
            static void main(String args[]) {  
                try { // 防止文件建立或读取失败,用catch捕捉错误并打印,也可以throw  
          
                    /* 读入TXT文件 */  
                    String pathname = "D:\\twitter\\13_9_6\\dataset\\en\\input.txt"; // 绝对路径或相对路径都可以,这里是绝对路径,写入文件时演示相对路径  
                    File filename = new File(pathname); // 要读取以上路径的input。txt文件  
                    InputStreamReader reader = new InputStreamReader(  
                            new FileInputStream(filename)); // 建立一个输入流对象reader  
                    BufferedReader br = new BufferedReader(reader); // 建立一个对象,它把文件内容转成计算机能读懂的语言  
                    String line = "";  
                    line = br.readLine();  
                    while (line != null) {  
                        line = br.readLine(); // 一次读入一行数据  
                    }  
          
                    /* 写入Txt文件 */  
                    File writename = new File(".\\result\\en\\output.txt"); // 相对路径,如果没有则要建立一个新的output。txt文件  
                    writename.createNewFile(); // 创建新文件  
                    BufferedWriter out = new BufferedWriter(new FileWriter(writename));  
                    out.write("我会写入文件啦\r\n"); // \r\n即为换行  
                    out.flush(); // 把缓存区内容压入文件  
                    out.close(); // 最后记得关闭文件  
          
                } catch (Exception e) {  
                    e.printStackTrace();  
                }  
            }  
        }  
    
    展开全文
  • Python 将数据写入CSV文件

    万次阅读 多人点赞 2019-04-27 14:30:50
    python 将数据写入csv文件 1 介绍CSV 逗号分隔值(Comma-Separated Values,CSV,也称为字符分隔值,分隔字符也可以不是逗号)。 保存形式 其文件以纯文本形式存储表格数据(数字和文本)。纯文本意味着该...

    python 将数据写入csv文件

    1 介绍CSV

    逗号分隔值(Comma-Separated Values,CSV,也称为字符分隔值分隔字符也可以不是逗号)。

    • 保存形式

    其文件以纯文本形式存储表格数据(数字和文本)。纯文本意味着该文件是一个字符序列,不含必须像二进制数字那样被解读的数据。

    • 分隔符号

    CSV文件由任意数目的记录组成,记录间以某种换行符分隔;每条记录由字段组成,字段间的分隔符是其它字符或字符串,最常见的是逗号制表符

    • 打开方式

    通常,所有记录都有完全相同的字段序列。通常都是纯文本文件。建议使用WORDPAD或是记事本来开启,再则先另存新档后用EXCEL开启,也是方法之一。

    2. Python代码

    #!/usr/bin/python3
    # -*- coding: utf-8 -*-
    
    # 导入CSV安装包
    import csv
    
    # 1. 创建文件对象
    f = open('文件名.csv','w',encoding='utf-8')
    
    # 2. 基于文件对象构建 csv写入对象
    csv_writer = csv.writer(f)
    
    # 3. 构建列表头
    csv_writer.writerow(["姓名","年龄","性别"])
    
    # 4. 写入csv文件内容
    csv_writer.writerow(["l",'18','男'])
    csv_writer.writerow(["c",'20','男'])
    csv_writer.writerow(["w",'22','女'])
    
    # 5. 关闭文件
    f.close()
    

    3.运行结果

    本文介绍就直接使用文本打开,结果如下:
    在这里插入图片描述

    4 用Excel打开上述结果,发现出现空行问题

    4.1 Python2 解决

    将写入方式w 修改成wb

    f = open(‘文件名.csv’,‘wb’,encoding=‘utf-8’)

    4.2 Python3 解决

    Python2的解决方式也支持,同时也可以添加**newline=’’"**参数即可,如下所示:

    f = open(‘文件名.csv’,‘w’,encoding=‘utf-8’,newline=’’ ")

    综上:经过以上处理,空白行已取消。
    在这里插入图片描述

    以上内容仅是代表个人总结 若有错误之处,还请批评指正,欢迎大家一起学习!

    展开全文
  • python读取、写入txt文本内容

    万次阅读 多人点赞 2019-08-22 21:54:28
    a : 写入文件,若文件不存在则会先创建再写入,但不会覆盖原文件,而是追加在文件末尾 rb,wb: 分别于r,w类似,但是用于读写二进制文件 r+ : 可读、可写,文件不存在也会报错,写操作时会覆盖 w+ : 可...
  • Java读取和写入图片

    万次阅读 2018-06-05 21:14:38
    File originalFile = new File("D:\\test\\dabai.jpg");//指定要读取的图片 try { File result = new File("...//要写入的图片 if (result.exists()) {//校验该文件是否已存在 ...
  • php写入文本,文件夹不存在则创建

    万次阅读 2020-12-14 15:32:21
    // 安全文件路径,$fileName:完成文件路径 function securityFilePath($fileName,$...file_exists($path)){// 判断路径是否存在,如果不存在则mkdir创建,并写入权限 mkdir ($path,$read_write,true); } } ...
  • Matlab学习笔记——xlswrite将数据写入xls文件

    万次阅读 多人点赞 2018-06-28 02:21:04
    xlswrite将数据写入xls文件 一、功能简介 将数据写入微软电子表格文档中。 二、使用方法 (filename, M) 将矩阵M的数据写入名为filename的Excel文件中。 xlswrite(filename, M, sheet) 将矩阵M的数据写入文件...
  • python覆盖写入,追加写入

    万次阅读 2019-01-15 09:24:57
    追加写入:   # -*- coding:utf-8 -*- # a 指定打开文件的模式,a为追加 r为只读 a=open('test.txt', 'a') a.write('追加写入') a.close()   f=open('test.txt', 'r') print f.read()   覆盖写入: ...
  • SSD写入放大 / 主机写入量、对NAND写入量的意义与差别SSD的组成层次写入放大主机写入量、对NAND写入量 使用CrystalDiskInfo查看我自己的ssd: 结果发现写入量有两个统计数数据:主机写入量总计、对NAND写入量总计 ...
  • Excel写入换行-JAVA

    万次阅读 2019-11-13 23:40:55
    核心代码如下 设置Excel样式 HSSFCellStyle bodyStyle = workbook.createCellStyle();...String strText = “测试写入Excel文本换行\r\n换行后的值”; 使用HSSFRichTextString()处理文本值 new...
  • java写入文件的几种方法(一)

    万次阅读 多人点赞 2019-01-16 11:42:58
    1. FileWritter写入文件 FileWritter, 字符流写入字符到文件。默认情况下,它会使用新的内容取代所有现有的内容,如下: new FileWriter(file); 然而,当指定一个true (Boolean)值作为FileWritter构造函数的第...
  • 如何使用python将数据写入txt文件

    万次阅读 多人点赞 2019-04-28 16:44:14
    Python中文件的读取和写入 PYTHON将list或/dict对象写入txt/json文件 python(如何将数据写入本地txt文本文件) python中文件写入TXT Python中将变量按行写入txt文本中 python把变量写入txt文件。 Python读写文件 ...
  • Java实现文件写入——IO流(输入输出流详解)

    万次阅读 多人点赞 2017-09-09 20:43:12
    输入输出的重要性:     ...输入和输出功能是Java对...程序从输入流读取数据,向输出流写入数据。Java是面向对象的程序语言,每一个数据流都是一个对象,它们提供了各种支持“...
  • Python写入数据到txt文本中

    万次阅读 多人点赞 2019-07-12 16:12:09
    # 前面省略,从下面直奔...result2txt=str(data) # data是前面运行出的数据,先将其转为字符串才能写入 with open('结果存放.txt','a') as file_handle: # .txt可以不自己新建,代码会自动新建 file_handle.write(...
  • Spark DataFrame 写入MySQL性能调优

    万次阅读 2019-07-29 14:18:39
    最近在做公司运营报表时需要将百万数据一次性写入MySQL简单指定必须参数url,user,password,driver(也为必须参数,如果不指定会报错),dbtable后,发现写入数据时非常的慢,甚至只写入一部分后直接报错,为解决此问题...
  • Python OpenCV 写入视频

    千次阅读 2019-06-16 15:15:09
    Python OpenCV 写入视频 Python OpenCV 写入MP4 Python OpenCV 写入视频失败
  • 读取/写入位置发生访问冲突

    万次阅读 多人点赞 2016-06-08 15:41:20
    C/C++程序运行时提示“读取/写入位置发生访问冲突”。例如:0x00007FFF33515D43 (swscale-4.dll) (QTDemo0.exe 中)处的第一机会异常: 0xC0000005: 读取位置 0x0000000000000040 时发生访问冲突。 如图所示: ...
  • C++文件操作,读取,写入,追加写入

    千次阅读 多人点赞 2020-05-26 23:12:03
    文件写入,会覆盖原来的内容 代码 #include<fstream> #include<iostream> using namespace std; int main() { fstream f; f.open("data.txt",ios::out); //输入你想写入的内容 f<<"123323"&...
  • Python 将列表数据写入文件(txt, csv, excel)

    万次阅读 多人点赞 2018-07-02 21:15:10
    写入txt文件 def text_save(filename, data):#filename为写入CSV文件的路径,data为要写入数据列表. file = open(filename,'a') for i in range(len(data)): s = str(data[i]).replace('[','').replace(']','')...
  • php文件写入

    千次阅读 2019-08-25 11:30:31
    方式一 file_put_contents 写入 function write_one(){ // file_put_contents 写入的特征 // 向指定的文件当中写入一个字符串(会清空原有的内容),如果文件不存在则创建文件。返回的是写入的字节长度 $...
  • jxl 写入excel

    2011-06-22 16:11:51
    jxl 写入exceljxl 写入exceljxl 写入exceljxl 写入exceljxl 写入exceljxl 写入exceljxl 写入exceljxl 写入exceljxl 写入exceljxl 写入exceljxl 写入exceljxl 写入exceljxl 写入exceljxl 写入exceljxl 写入exceljxl ...
  • Python学习笔记(29)-Python创建并写入word文档

    万次阅读 热门讨论 2017-07-18 14:45:23
    一,简介上一篇已经介绍了python-docx模块的安装和导入,本篇直接介绍如何创建并写入word文档,需要注意的是:创建word并写入之后,操作的都是内存中的对象,最后需要保存到文件,才能看到真实的文件。二,代码演示...
  • Python 写入文件

    千次阅读 2019-11-04 16:59:38
    写入空文件 将文本写入文件,在调用open()时需要提供另一个参数,告诉python要写入打开的文件。 调用gopen()时需要提供两个实参,第一个是打开文件的名称,第二个实参是告诉python打开文件的属性,其中属性有以下...
  • 变量打印出来为上面部分,但是当写入文本时候,就变成了一行,怎么解决是为什么 ![图片说明](https://img-ask.csdn.net/upload/201506/04/1433428592_988972.png)
  • 周末想把自己的另一台电脑装成ubuntu,但只有一个装了mint的,使用了dd命令,按照网上搜到的步骤进行,发现并不行,写入成功了,但写入的U盘还是空的,使用USB镜像写入工具也一样.据网上的资源说这两种...
  • Java OutputStream写入文件与文件复制

    万次阅读 2017-08-14 17:14:24
    2,当然,还支持一个字节一个字节的读写,那么一个字节一个字节的读写,读出来的字节和写入的字节都是用的int类型的参数。3,int参数只会使用它的8个二进制位,也就是说类似于将int强行转换为byte,我感觉很无聊的...
  • linux写echo写入文件与sed写入文件

    千次阅读 2019-02-27 20:36:27
    一、echo写入文件 echo写入文件有两种模式,一种是覆盖写入,一种是追加写入 覆盖写入是在文件末尾,另起一行,将字符串写入文件 追加写入 [aizhiwenben@web01 ~]$ touch b.txt [aizhiwenben@web01 ~]$ echo "...
  • Python学习-将list列表写入文件并读取方法汇总

    万次阅读 多人点赞 2019-06-20 22:36:22
    1.writelines()直接写入 l=["A","B","C","D"] f=open("k.txt","w") f.writelines(l) f.close() 该方法写入直接写入列表元素 2.str转化为字符串写入 l=["A","B","C","D",1,2,3] f=open("k.txt","w") f....
  • spark写入hdfs

    千次阅读 2020-03-06 13:57:07
    spark streaming写入hdfs 场景: 需要将数据写入hdfs,打包成一个gz包, 每5分钟执行一次spark任务。 最终的结果如下: 5分钟跑一次spark, 将数据写入hdfs, 会产生很多的小文件。 spark代码 val hadoopConf: ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,356,200
精华内容 942,480
关键字:

写入