簡體   English   中英

將列表塊寫入文件,在塊末尾添加換行符

[英]Write chunks of list to file, add newline at end of chunk

對此有問題。 我正在尋找大量關於如何將列表寫入文件以及如何使用列表理解、numpy(此處似乎不適用)和其他方法拆分列表的示例,但不是我想要做的具體操作。

我的功能之一:

 def createdevstring():
        tree = ET.parse('regcheckdevicelist.xml')
        text = [child.text for child in tree.iter() if not child.text.strip() == '']
        devicename = ",".join(text)
        return devicename

它所做的是解析 xml 文檔並剝離 xml。 列表text最終看起來像這樣,盡管列表可以包含 3 到 10,000 多個條目。

例如:['devicename1', 'devicename2', 'devicename3']

我的 function 當前獲取這些列表條目並將它們連接到 a ,並存儲在 stringvar devicename

結果:

devicename1,devicename2,devicename3,

這很好用,但是,我正在嘗試使用最大設備查詢計數為 200 個設備名稱的 API。 如果我查詢 >200 個設備,我只會在 xml 響應中得到 200 個。

我一直試圖進入代碼但無法工作的是:

選項 1) 將列表拆分為包含來自tree數組的 200 個條目的子數組,最后一個數組是任意數字 <=200。 不需要相同大小的 arrays,只要它們的大小最大為 200。 然后,我需要一種方法將每個子數組繪制到一個 stringvar 中,其中格式與當前的格式相同,一個逗號分隔的值字符串,然后為每個構造的運行requests.request ["POST"....] cdv 字符串變量。

選項 2) 將列表成員寫入每個成員之間使用','的文件,在寫入 200 之后添加換行符'\n' 然后,對於文件中的每一行,執行requests.request["POST"....]

任何關於這方面的指導都會很棒。

這是一個建議。

首先,這里有一個迭代器 function 用於將可迭代對象拆分為塊。

def chunker(sequence, chunk_size):
    it = iter(sequence)
    while True:
        chunk = []
        try:
            for i in range(chunk_size):
                chunk.append(next(it))
            yield chunk
        except StopIteration:
            if chunk:
                yield chunk
            return

一旦你有了這個,我建議你創建一個 function 來代替你的createdevstring function,它只返回所有元素的文本,將 Z65E8800B5C6800AADFCZA 的工作留給調用者。

def get_text_of_elements():
    tree = ET.parse('regcheckdevicelist.xml')
    return (child.text for child in tree.iter() if not child.text.strip() == '')

這是調用者可以用它做的事情:

for text in chunker(get_text_of_elements(), 200):
    devicename = ",".join(text)
    # do whatever you want with it inside this loop

實際上這里get_text_of_elements將結果作為生成器返回,而不是一次創建整個列表,盡管如果您願意,可以通過將其從我的圓括號更改回您最初使用的方括號來返回一個列表 - 它仍然會工作。

一個輕微的變體是將轉換為設備名稱也放在 function 中,但也讓它成為一個迭代器而不是返回一個值,所以你在調用者中有一個很好的簡單循環:

def get_devicenames(chunk_size=200):
    ET.parse('regcheckdevicelist.xml')
    for text in chunker(
            (child.text for child in tree.iter() if not child.text.strip() == ''),
            chunk_size):
        yield ",".join(text)


for devicename in get_devicenames():
    # ... do something ...

暫無
暫無

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

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