簡體   English   中英

Function 使用一個文本中的一行和另一個文本中的一行來編寫文本

[英]Function that writes a text using one line from one text and one line from another text

因此,我編寫了一個代碼,該代碼應該使用其他兩個文本編寫一個文本文件,該文本以 Text No1. 中的一行文本開頭,然后是 Text No2. 中的一行,然后是 Text No1 中的一行文本。 等等,直到最后它應該以文本文件中行數最多的行結束,例如:

文本 No1。 行:a、b、c、d

文本 No2。 行:e、f、g、h、i、j、k

文字 3。 行(應由程序編寫) a, e, b, f, c, h, d, i, j, k

但是,目前,代碼

def text1():
    f = open("textnr1.txt","r", encoding="UTF-8")
    for line in f:
        y = line.split(".")
        print(len(y))
        
    f.close()
    f = open("textnr2.txt","r", encoding="UTF-8")
    for line in f:
        k = line.split(".")
        print(len(k))
    f.close()
    
    gar=max(len(k),len(y))
    f = open("results.txt","a", encoding="UTF-8")
    for i in range(gar):
        if i<len(y):
            f.append(y[i])
        if i<len(k):
            f.append(k[i])
    f.close()

僅當這些文本文件每個文本文件僅包含一行時才有效。 我應該修改什么?

如果兩個文件的長度相同,您可以簡單地使用zip同時從兩個文件中獲取行,然后將它們都寫入第三個文件(也使用上下文管理器):

with open('file1.txt') as f1, open('file2.txt') as f2, \
     open('result.txt', 'w') as res:

    for l1, l2 in zip(f1, f2):
        res.write(f'{l1}\n{l2}')

您應該修復代碼中的一些錯誤:

  1. 當您遍歷行時,您會計算len(y) ,但len(y)始終為 1(當然,如果您的行不包含. )。 我想您想使用len(y)作為“文件中的行數”。
  2. 您應該使用write()方法而不是append()
def text1():
    f = open("files/textnr1.txt", "r", encoding="UTF-8")
    first_text_lines = f.readlines()
    f.close()

    f = open("files/textnr2.txt", "r", encoding="UTF-8")
    second_text_lines = f.readlines()
    f.close()

    gar = max(len(first_text_lines), len(second_text_lines))
    f = open("files/results.txt", "a", encoding="UTF-8")
    for i in range(gar):
        if i < len(first_text_lines):
            f.write(first_text_lines[i])
        if i < len(second_text_lines):
            f.write(second_text_lines[i])
    f.close()

您可以通過利用 itertools 的鏈和 zip_longest 來合並列表推導中的輸入:

text1 = "abcd"
text2 = "efghijk"

from itertools import chain,zip_longest

r = [ *filter(None,chain.from_iterable(zip_longest(text1,text2)))]

print(r)
['a', 'e', 'b', 'f', 'c', 'g', 'd', 'h', 'i', 'j', 'k']

text1 和 text2 可以是您的 k 和 y 列表或任何可迭代對象(如果需要,甚至超過 2 個)

以上假設您的輸入中沒有空行。 要處理空行,您需要為較短的輸入使用不同的填充值:

noData = object()
r = [x for x in chain.from_iterable(zip_longest(text1,text2,fillvalue=noData)) 
             if x != noData] 

目前,您正在為文件中的每一行覆蓋 y 和 k 變量,因此在循環運行后,它們只有最后一行。

如果您仍然需要所有線路,只需執行以下操作:

with open("textnr2.txt","r", encoding="UTF-8") as f:
    k=f.readlines()

這將為您處理 f.close() ,並且是推薦的方式。 k 將是文件中所有行的列表。

你說你需要行,但在你的代碼中你是按句點分割的。 我假設這是因為您想測試 function 並且您的多行讀取不起作用。

修復文件讀取后,編寫行的代碼應該可以工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM