亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

python文本文件到行和列

python文本文件到行和列

躍然一笑 2023-02-07 10:51:33
所以我已經嘗試了一段時間并且似乎遇到了障礙并且想要幫助。我有幾個文本文件。不用全部寫出來,這里有一個例子:2020Grum GrumStamina: 20Agility: 23Strength: 20.5%Resistances: 20-21-302020Mondo SiloStamina: 23Agility: 13Strength: 10.5%Resistances: 20-21-20等等等等。有些是這樣的,它每 6 行開始一個新的統計文件,有些文本文件有它,所以每 10 行就有一個新的統計表。我的目標是每次統計表結束時,將其放入行和列中。我認為這在電子表格術語中稱為轉置,但我知道我做錯了什么?;蛘呒词鼓鞘钦_的說..例如,我希望文件在完成后看起來像這樣。Year | Name | Stamina | Agility | Str | Res2020 | Grum Grum | Stamina: 20 | Agility: 23 | Strength: 20.5% | Resistances: 20-21-30我已經嘗試過 Numpy、Pandas 和 idk 我做錯了什么,老實說不知道要搜索什么才能找到正確的答案。如果我能得到任何幫助,我將不勝感激,這些文件非常大,我希望能夠具體說明我需要統計表來填充的列數。如果您能提供幫助,請提前致謝。
查看完整描述

4 回答

?
幕布斯7119047

TA貢獻1794條經驗 獲得超8個贊

你可以試試這個來獲得所需的數據框:


with open(r'test1.txt','r') as file:

    data=file.read().split('\n\n')

data=[i.split('\n') for i in data]

df=pd.DataFrame(data,columns=['Year','Name','Stamina','Agility','Str','Res'])


print(df)

輸出:


   Year        Name  ...              Str                    Res

0  2020   Grum Grum  ...  Strength: 20.5%  Resistances: 20-21-30

1  2020  Mondo Silo  ...  Strength: 10.5%  Resistances: 20-21-20

2  2020   Grum Grum  ...  Strength: 20.5%  Resistances: 20-21-30

3  2020  Mondo Silo  ...  Strength: 10.5%  Resistances: 20-21-20

并編寫.txt具有不同行數且具有相同結構的文件列表的數據幀,您可以嘗試:


選項1

import pandas as pd


files=['test1.txt','test2.txt']                     #list of files


df=pd.DataFrame(columns=['Year','Name','Stamina','Agility','Str','Res'])  #create the dataframe


for file in files:                                  #we open each file

    with open(r'path_of_files'+file,'r') as file_r:   

        data=file_r.read().strip().split('\n\n')

        data=[i.split('\n') for i in data if i!=''] #get the rows

        print(data)

        s = pd.DataFrame(data, columns=df.columns)  

        df =pd.concat([df, s], ignore_index=True)   #we append the new rows to the dataframe

        

        

print(df)

df.to_csv(r'test3.txt', sep='|', index=False)       #write the final dataframe to the output file('test3.txt'), with '|' as separator 

選項 2

import pandas as pd


files=['test1.txt','test2.txt']                      #list of files


for file in files:                                   #we open each file

    with open(r'path_of_files'+file,'r') as file_r, open(r'test3.txt', 'a') as fout:

        data=file_r.read().strip().split('\n\n')

        data=[i.split('\n') for i in data if i!='']

        df=pd.DataFrame(data,columns=['Year','Name','Stamina','Agility','Str','Res'])   #create a dataframe with the data of the current file

        if files.index(file)==0:

            fout.write(df.to_string( index = False)) #we let header=true to the first iteration to write the columns, and also write the data

        else:

            fout.write(df.to_string(header = False, index = False))  #we write the dataframe without the index and the columns names

        fout.write('\n')                             #a newline to place correctly the next rows

示例

對于一些虛擬文件,例如下面的文件 ( test1.txt,test2.txt),您可以看到test3.txt帶有兩個選項的結果 ( ):


測試1.txt


2020

Grum Grum

Stamina: 20

Agility: 23

Strength: 20.5%

Resistances: 20-21-30


2020

Mondo Silo

Stamina: 23

Agility: 13

Strength: 10.5%

Resistances: 20-21-20

測試2.txt


2020

Grum Grum

Stamina: 20

Agility: 23

Strength: 20.5%

Resistances: 20-21-30


2020

Mondo Silo

Stamina: 23

Agility: 13

Strength: 10.5%

Resistances: 20-21-20


2020

Mondo Silo

Stamina: 23

Agility: 13

Strength: 10.5%

Resistances: 20-21-20


2020

Mondo Silo

Stamina: 23

Agility: 13

Strength: 10.5%

Resistances: 20-21-20

帶有選項 1 的test3.txt(輸出文件)


Year|Name|Stamina|Agility|Str|Res

2020|Grum Grum|Stamina: 20|Agility: 23|Strength: 20.5%|Resistances: 20-21-30

2020|Mondo Silo|Stamina: 23|Agility: 13|Strength: 10.5%|Resistances: 20-21-20

2020|Grum Grum|Stamina: 20|Agility: 23|Strength: 20.5%|Resistances: 20-21-30

2020|Mondo Silo|Stamina: 23|Agility: 13|Strength: 10.5%|Resistances: 20-21-20

2020|Mondo Silo|Stamina: 23|Agility: 13|Strength: 10.5%|Resistances: 20-21-20

2020|Mondo Silo|Stamina: 23|Agility: 13|Strength: 10.5%|Resistances: 20-21-20

帶有選項 2 的test3.txt(輸出文件)


 Year        Name      Stamina      Agility              Str                    Res

 2020   Grum Grum  Stamina: 20  Agility: 23  Strength: 20.5%  Resistances: 20-21-30

 2020  Mondo Silo  Stamina: 23  Agility: 13  Strength: 10.5%  Resistances: 20-21-20

 2020   Grum Grum  Stamina: 20  Agility: 23  Strength: 20.5%  Resistances: 20-21-30

 2020  Mondo Silo  Stamina: 23  Agility: 13  Strength: 10.5%  Resistances: 20-21-20

 2020  Mondo Silo  Stamina: 23  Agility: 13  Strength: 10.5%  Resistances: 20-21-20

 2020  Mondo Silo  Stamina: 23  Agility: 13  Strength: 10.5%  Resistances: 20-21-20


查看完整回答
反對 回復 2023-02-07
?
POPMUISE

TA貢獻1765條經驗 獲得超5個贊

  • 此選項在將數據加載到數據幀之前修復數據格式。

    • 每列頂部的標題和標題下方每行中的數據。

    • 這將以標準表格格式顯示數據作為一個選項,因為已經有其他好的答案可以將數據轉換為請求的格式。

    • 從信息存儲和檢索的角度來看,這是一種呈現和存儲數據的標準方式。

    • 以標準方式存儲數據可以更輕松地檢索和使用其他工具來可視化數據。

  • [0::6]: 列表切片,從 0 開始獲取列表中的第 6 個值

  • [1::6]: 列表切片獲取列表中從 1 開始的每 6 個值

  • 用于collections.defaultdict獲取列表元素并將它們轉換為字典。

  • sep=','使用或將數據框保存到 csvsep='|'

  • 讀回文件df = pd.read_csv('characters.csv', sep='|')

import pandas as pd

from collections import defaultdict as dd


# read the file

with open('test.txt', 'r') as f:

    # read the text in; results in a list of strings

    text_list = [r.strip() for r in f.readlines() if r.strip()]  # remove all new lines and empty rows


# add Year: in front of each year number

years = text_list[0::6]  # create a list of each year

text_list[0::6] = [f'Year: {f}' for f in years]


# add Name: in front of each name

names = text_list[1::6]  # create a list of each name

text_list[1::6] = [f'Name: {f}' for f in names]


# split each string at ': '

text_list = [x.split(': ') for x in text_list]


# create a dict for each value

data = dd(list)

for text in text_list:

    data[text[0]].append(text[1])


# load data into a dataframe

df = pd.DataFrame(data)


# display df

   Year        Name Stamina Agility Strength Resistances

0  2020   Grum Grum      20      23    20.5%    20-21-30

1  2020  Mondo Silo      23      13    10.5%    20-21-20


# save

df.to_csv('characters.csv', sep='|', index=False)


# file output

year|name|Stamina|Agility|Strength|Resistances

2020|Grum Grum|20|23|20.5%|20-21-30

2020|Mondo Silo|23|13|10.5%|20-21-20


查看完整回答
反對 回復 2023-02-07
?
慕尼黑5688855

TA貢獻1848條經驗 獲得超2個贊

嘗試這個


您可以將您的 txt 文件讀取為 csv


file=pd.read_csv('filename.txt',sep=" ",header=None,error_bad_lines=False)


or 


file =pd.read_fwf('filename.txt')


查看完整回答
反對 回復 2023-02-07
?
紅顏莎娜

TA貢獻1842條經驗 獲得超13個贊

如果您將文本文件保持在相同的格式并在組之間換行,這應該適合您:


import xlsxwriter


items = []


# parse through .txt file

with open('file.txt', 'r') as r:

    text = list(r.read().splitlines())

    while text.count('') != 0:

        text.remove('')

    x = 0

    while True:

        items.append([])

        for num in range(0, 6):

            items[x].append(text[0])

            text.remove(text[0])

        x += 1

        if len(text) == 0:

            break

    print(items)



# Starting worksheet

workbook = xlsxwriter.Workbook('example.xlsx')

worksheet = workbook.add_worksheet()


row = 0


# Writing column titles

titles = ['Year', 'Name', 'Stamina', 'Agility', 'Str', 'Res']

for i in range(0, 6):

    worksheet.write(row, i, titles[i])


# fills in data from parsed .txt file

x, row = 0, 1

while True:

    for i in range(0, 6):

        cur = items[x][0]

        worksheet.write(row, i, cur)

        items[x].remove(cur)

    print(items)

    row += 1

    x += 1

    print('hi')

    if len(items) == x:

        break


# Closes workbook

workbook.close()



查看完整回答
反對 回復 2023-02-07
  • 4 回答
  • 0 關注
  • 178 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號