如何循環到dictionary中的dictionary以指定方式組織CSV中的數據

我被一個問題困擾了幾天。我制作了一個腳本:

-takesCSV文件中的數據-按數據文件第一列中的相同值對其進行排序-instert按不同模板文本文件中指定字段行中的數據進行排序-將文件保存在盡可能多的副本中,因為數據文件的第一列中有不同的值。下圖顯示了它的工作原理:

但我還有兩件事要做。當在如上所示的單獨文件中時,數據文件的第二列中有一些相同的值,那么該文件應該插入第三列中的值,而不是重復第二列中的相同值。在下面的圖片上,我展示了它應該是什么樣子:

我還需要在數據文件的第一列的某個地方加上“z”分隔的值。

有一個數據文件:

111_0,3005,QWE
111_0,3006,SDE
111_0,3006,LFR
111_1,3005,QWE
111_1,5345,JTR
112_0,3103,JPP
112_0,3343,PDK
113_0,2137,TRE
113_0,2137,OMG

我做了一個代碼:

import shutil
 
with open("data.csv") as f:
    contents = f.read()
    contents = contents.splitlines()
 
values_per_baseline = dict()
 
for line in contents:
    key = line.split(',')[0]
    values = line.split(',')[1:]
    if key not in values_per_baseline:
        values_per_baseline[key] = []
    values_per_baseline[key].append(values)
 
for file in values_per_baseline.keys():
    x = 3
    shutil.copyfile("of.txt", (f"of_%s.txt" % file))
    filename = f"of_%s.txt" % file
    for values in values_per_baseline[file]:
        with open(filename, "r") as f:
            contents = f.readlines()
            contents.insert(x, '      o = ' + values[0] + '\n          ' + 'a = ' + values[1] +'\n')
        with open(filename, "w") as f:
            contents = "".join(contents)
            f.write(contents)
            f.close()

我一直在嘗試制作類似于列表字典的東西,但我無法以正確的方式實現它。任何幫助或建議都將不勝感激。

? 最佳回答:

當我運行你的代碼時,我得到以下錯誤:

    contents.insert(x, '      o = ' + values[0] + '\n          ' + 'a = ' + values[3] +'\n')
IndexError: list index out of range

讓我們想想這個錯誤是從哪里來的。它是列表上的一個IndexError。這行中使用的唯一列表是values,所以這似乎是一個開始尋找的好地方。

要調試,您可以考慮在吐出錯誤的行之前添加類似的內容:

            print(values)
            print(values[0])
            print(values[3])

which gives

['3005', 'QWE']
3005
Traceback (most recent call last):
  File "qqq.py", line 25, in <module>
    print(values[3])
IndexError: list index out of range

問題在于values[3],這是有意義的,因為len(values)==2,所以索引必須是01。如果我們把values[3]改成values[1],我想你會得到你想要的。例如。:

$ cat of_111_0.txt
line
line
line
      o = 3006
          a = LFR
      o = 3006
          a = SDE
      o = 3005
          a = QWE
line
line
line
line
line

要進入問題的下一步,我建議您將第一個循環更改為:

for line in contents:
    key = line.split(',')[0]
    values = line.split(',')[1:]
    if key not in values_per_baseline:
        values_per_baseline[key] = {}
    if values[0] not in values_per_baseline[key]:
        values_per_baseline[key][values[0]] = values[1]
    else:
        values_per_baseline[key][values[0]] += '<COMMA>' + values[1]

這讓你的字典成為:

{'111_0': {'3005': 'QWE', 
           '3006': 'SDE<COMMA>LFR'}, 
 '111_1': {'3005': 'QWE', 
           '5345': 'JTR'}, 
 '112_0': {'3103': 'JPP', 
           '3343': 'PDK'}, 
 '113_0': {'2137': 'TRE<COMMA>OMG'}}

然后在寫入文件時,需要將循環更改為:

        for key in values_per_baseline[file]:
            contents.insert(x, f'{6*sp}o = {key}\n{10*sp}a = {values_per_baseline[file][key]}\n')

您的文件現在看起來像:

line
line
line
      o = 3006
          a = SDE<COMMA>LFR
      o = 3005
          a = QWE
line
line
line
line
line

你可以做的其他事情

現在,你可以做一些事情來簡化你的代碼,同時保持它readable.*

  • 在第10行和第11行,不需要兩次使用line.split。只需添加一個類似split_line = line.split(',')的行,然后添加key = split_line[0]values = split_line[1:]。(您可以同時刪除keyvalues,只引用split_line[0]split_line[1],但這會降低代碼的可讀性。
  • 在第17行,在每個循環中定義x。把它從循環中去掉。
  • 在第12行和第13行,首先使用(f"of_%s.txt" % file),然后在下一行的文件中定義它。建議你先定義filename,然后再定義shutil.copyfile("of.txt", filename)。此外,您還錯誤地使用了f-strings。你可以直接寫filename = f"of_{file}.txt"
  • 在第23行,您可以將insert命令更改為f-string(如果您覺得它更可讀的話)。例如:contents.insert(x, f'{6*sp}o = {values[0]}\n{10*sp}a = {values[1]}\n')
  • 最后,在for values in values_per_baseline.keys()循環中,打開和關閉文件的次數超出了需要。您可以重新安排您的操作:
    with open(filename, "r") as f:
        contents = f.readlines()
        for values in values_per_baseline[file]:
            contents.insert(x, '      o = ' + values[0] + '\n          ' + 'a = ' + values[1] +'\n')
    with open(filename, "w") as f:
        contents = "".join(contents)
        f.write(contents)
        f.close()

*對于這樣一個簡短的腳本,我認為確保其可讀性比確保其有效性更重要,因為您希望能夠在3周或3年后回來,了解您所做的事情。出于這個原因,我也建議你評論一下你所做的事情。

主站蜘蛛池模板: 99精品久久精品一区二区| 亚洲线精品一区二区三区| 中文字幕人妻丝袜乱一区三区 | 色婷婷一区二区三区四区成人网| 午夜视频一区二区| 国产一区视频在线| 一区二区三区四区在线视频 | 精品人妻一区二区三区四区| 国产激情视频一区二区三区| 国产美女口爆吞精一区二区| 加勒比精品久久一区二区三区| 男插女高潮一区二区| 中文字幕一区二区三匹| 中文字幕一区视频| 亚洲综合无码一区二区三区| 日本不卡一区二区视频a| 精品一区二区三区在线观看| 日韩一区二区三区视频| 无码精品人妻一区二区三区免费| 蜜臀AV无码一区二区三区| 伊人久久一区二区三区无码 | 激情综合丝袜美女一区二区| 一本一道波多野结衣AV一区| 日韩免费无码一区二区三区 | 午夜福利一区二区三区在线观看| 狠狠色成人一区二区三区| 国产精品va无码一区二区| 国偷自产一区二区免费视频| 日本亚洲国产一区二区三区| 国产在线精品一区二区不卡| 亚洲AV无码一区东京热久久| 老熟妇仑乱视频一区二区 | 日韩在线视频一区| 日韩精品一区二区三区影院| www一区二区www免费| 久久er99热精品一区二区| 蜜桃无码一区二区三区| 亚洲熟女www一区二区三区| 国产精品久久久久一区二区三区| 性色av无码免费一区二区三区| 国偷自产视频一区二区久 |