Python读写excel和txt格式文件交互

今天在网上学习,看到python读写excel有4种方法,并各有优劣

  • XlsxWriter只能用来写文件,不支持XLS格式文件
  • OpenPyXL所支持的功能介于XlsxWriter和xlwt之间,不支持XLS格式文件
  • xlrd&xlwt,支持XLS,XLSX格式
  • 用pandas进行excel读写,比xlrd&xlwt快且简单

参考资料:
用Python读写Excel文件的方式比较

excel和txt格式互换基本

import os.path
import xlrd
import xlwt
import pandas as pd
import numpy as np


# fileName = r'C:\Users\Lenovo\Desktop\1.txt'
def readFromTxt(filename):
    excel_list = []
    if not os.path.isfile(filename):
        print(filename + "does not exit")
    else:
        try:
            infile = open(filename, "r")
            line = infile.readline()
            while line != '':  # 这里不是空格
                print(line)
                tmp = line.split()
                tmp = [eval(i) for i in tmp]  # 转换成整数
                excel_list.append(tmp)
                line = infile.readline()
        except:
            print("Something wrong happens")
        finally:
            infile.close()
    return excel_list


def writeToTxt(filename, excel_list):
    outFile = open(filename, "w")
    for row in range(len(excel_list)):
        for col in range(len(excel_list[row])):
            outFile.write(str(excel_list[row][col]))
            outFile.write(" ")
        outFile.write("\n")
    outFile.close()


# data1.xls
def readFromExcelByXlrd(filename, sheetName='Sheet1'):
    excel_list = []
    try:
        book = xlrd.open_workbook(filename)
        sheet1 = book.sheet_by_name(sheetName)
        nrows = sheet1.nrows
        print('表格总行数', nrows, end=", ")
        ncols = sheet1.ncols
        print('表格总列数', ncols)
        for i in range(nrows):
            row = sheet1.row_values(i)
            excel_list.append(row)

        for lst in excel_list:
            for data in lst:
                print(data, end=" ")
            print('\n')
    except Exception as e:
        print(str(e))
    finally:
        return excel_list


def writeToExcelByXlwt(fileName, excel_list, sheetName='Sheet1'):
    # # 创建一个workbook 设置编码
    book = xlwt.Workbook(encoding='utf-8')
    sheet = book.add_sheet(sheetName, True)
    for row in range(len(excel_list)):
        for col in range(len(excel_list[row])):
            sheet.write(row, col, excel_list[row][col])
    book.save(fileName)


# # data1.xls
def readFromExcelByPandas(filename, sheetName='Sheet1'):
    excel_list = []
    try:
        df = pd.read_excel(filename, sheet_name=sheetName, header=None)
        print('表格总行数', df.shape[0], '表格总列数', df.shape[1])
        # 查看某一列:    print(df['标题'].values)
        # 查看某一行:     print(df.values[0])
        excel_list = df.values.tolist()

        for lst in excel_list:
            for data in lst:
                print(data, end=" ")
            print('\n')
    except Exception as e:
        print(str(e))
    finally:
        return excel_list


def writeToExcelByPandas(filename, excel_list, sheetName='Sheet1'):
    tmp = np.array(excel_list)
    keys = tmp[0][:]  # 把list数据第一行作为标题
    tmp1 = tmp[1:][:]  # 把list数据第二行开始作为数据
    values = [tmp1[:, i].tolist() for i in range(tmp1.shape[1])]
    dict1 = dict(zip(keys, values))
    df = pd.DataFrame(dict1)
    df.to_excel(filename, sheet_name=sheetName, index=False)


if __name__ == '__main__':
    txtFileName = r'C:\Users\Lenovo\Desktop\1.txt'
    excelFileName = r'F:\PycharmWorkPlace\机器学习\data1.xls'
    excelFileName1 = r'C:\Users\Lenovo\Desktop\data2.xls'
    excel_list = readFromExcelByPandas(excelFileName)
    writeToTxt(txtFileName,excel_list)
    writeToExcelByPandas(excelFileName1,excel_list)

选择txt数据复制到excel文件

背景:有个师兄想保存某个网站所有的数据记录,但数据过多,一个一个复制是不可能的,于是叫我帮他写一个,我的想法是:
先把网站数据全部复制到txt文件内,然后用程序读到excel内
选择方式:手动输入文件完整路径或可以打开文件夹的方式选择读写文件目录
(但我感觉python应该可以自动化脚本从网站直接爬取,省了手动复制到txt,但是考虑到那样要帮他爬数据,我想想时间有限,还是算了)

import os.path
import pandas as pd
import tkinter
from tkinter import Tk
from tkinter.filedialog import askopenfilename


def readFromTxt(fileName) -> '读取数据':
    if not os.path.isfile(fileName):
        print(fileName + "does not exit")
        return
    df = pd.read_table(fileName)
    return df


def writeToExcel(fileName, df, Header=False):
    if os.path.isfile(fileName):
        choose = input(fileName + " has already exits.Would you wanna overwrite it?Please input Y to continue").strip()
        if choose != 'Y' and choose != 'y':
            return
    df.to_excel(fileName, index=False, header=Header)


def main():
    choice = input("Would you wanna input fileName or select by yourself?Please input choice between L and R")
    selectMode = False
    if choice == 'L' or choice == 'l':
        print("Now select the absolute path of the *.txt you wanna copy")
        selectMode = True
        window = Tk()
        window.withdraw()  # 除掉小框
        fileName = askopenfilename(defaultextension=".txt",
                                   title='Select the  .txt file',
                                   filetypes=[('TXT', '*.txt'), ('All Files', '*')], initialdir='C:\\Windows')
    else:
        fileName = input("Input the absolute path of *.txt file:").strip()

    df = readFromTxt(fileName)

    if df is not None:
        if not selectMode:
            fileName1 = input("Input the absolute path of *.xls file:").strip()
        else:
            print("Now select the absolute path of the *.xls file you wanna save")
            window = Tk()
            window.withdraw()  # 除掉小框
            fileName1 = tkinter.filedialog.asksaveasfilename(title=u'Save as *.xls file', filetypes=[("XLS", ".xls")],
                                                             initialdir='C:\\Windows')
            if not fileName1.endswith(".xls"):
                fileName1 += ".xls"
        choose = input('Does the *.txt file contains header?Please input Y(y) or other character to continue').strip()
        if choose == 'Y' or choose == 'y':
            writeToExcel(fileName1, df, True)
        else:
            writeToExcel(fileName1, df)
        print("Succeed copy datas!")
    else:
        print("Failed copy datas to the excel file.")


if __name__ == '__main__':
    main()

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

广大菜鸟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值