我被一個問題困擾了幾天。我制作了一個腳本:
-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()
我一直在嘗試制作類似于列表字典的東西,但我無法以正確的方式實現它。任何幫助或建議都將不勝感激。
當我運行你的代碼時,我得到以下錯誤:
讓我們想想這個錯誤是從哪里來的。它是列表上的一個
IndexError
。這行中使用的唯一列表是values
,所以這似乎是一個開始尋找的好地方。要調試,您可以考慮在吐出錯誤的行之前添加類似的內容:
which gives
問題在于
values[3]
,這是有意義的,因為len(values)==2
,所以索引必須是0
和1
。如果我們把values[3]
改成values[1]
,我想你會得到你想要的。例如。:要進入問題的下一步,我建議您將第一個循環更改為:
這讓你的字典成為:
然后在寫入文件時,需要將循環更改為:
您的文件現在看起來像:
你可以做的其他事情
現在,你可以做一些事情來簡化你的代碼,同時保持它readable.*
line.split
。只需添加一個類似split_line = line.split(',')
的行,然后添加key = split_line[0]
和values = split_line[1:]
。(您可以同時刪除key
和values
,只引用split_line[0]
和split_line[1]
,但這會降低代碼的可讀性。x
。把它從循環中去掉。(f"of_%s.txt" % file)
,然后在下一行的文件中定義它。建議你先定義filename
,然后再定義shutil.copyfile("of.txt", filename)
。此外,您還錯誤地使用了f-strings。你可以直接寫filename = f"of_{file}.txt"
。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()
循環中,打開和關閉文件的次數超出了需要。您可以重新安排您的操作:*對于這樣一個簡短的腳本,我認為確保其可讀性比確保其有效性更重要,因為您希望能夠在3周或3年后回來,了解您所做的事情。出于這個原因,我也建議你評論一下你所做的事情。