我有一个名为45-1.txt
1-17.txt
等文件的目录。基本上他们是由' - '分隔的2个数字。最后用.txt。
我有一个看起来像这样但有数千行的数据集:
values/test/10/blueprint-0.png,2089.0,545.0,2100.0,546.0
values/test/10/blueprint-0.png,2112.0,545.0,2136.0,554.0
values/test/45/blueprint-1.png,112.0,45.0,36.0,654.0
我在这些行中关注的值是每行的前2个数字,因此10-0
,10-0
,45-1
等等。
我想要做的是复制具有2个数字的行,例如10-0作为前一个文件的名称的一部分,在这个例子中应该复制45-1。
我的方法:
import os,csv,re
my_dict = {}
source_dir = '/home/ubuntu/Desktop/EAST/testing_txts/'
for element in os.listdir(source_dir):
my_dict[element] = ''
# print(my_dict)
with open('/home/ubuntu/Desktop/EAST/ground_truth.txt') as f:
reader = csv.reader(f)
for key in my_dict:
for filename, *numbers in reader:
k1, k2 = re.findall(r'\d+', filename)
k3,k4 = re.findall(r'\d+', key)
if k3 == k1 and k2 == k4:
my_dict[key].append(filename)
为了解释我做了一点,我读了我目录中的所有名称文件,并将它们放在字典中,然后将逐行读取我的文件中的特定键,如果我发现存在类似的行,我将将整行附加到特定的字典键,假设我们在第一个目录25-1.txt
,45-1.txt
和1-0.txt
中,并且在另一个文件中我有:
values/test/10/blueprint-0.png,2089.0,545.0,2100.0,546.0
values/test/10/blueprint-0.png,2112.0,545.0,2136.0,554.0
values/test/45/blueprint-1.png,112.0,45.0,36.0,654.0
values/test/45/blueprint-1.png,2.0,5.0,6.0,54.0
最终结果将是3个键只有45-1,其中包含元素,元素是values/test/45/blueprint-1.png,112.0,45.0,36.0,654.0
和values/test/45/blueprint-1.png,2.0,5.0,6.0,54.0
(元素列表)我上面的代码所遇到的问题是我我不能正确地附加完整的句子,并获得我的密钥,我得到的错误不能使用附加字符串,当我使用my_dict[key] =filename
测试知道它错了并覆盖,只有我的第一个key中有任何元素,其余的都是空的,知道它们也应该存在。
修改 在有用的答案后修复列表问题后我做了一些快速调整,我的代码变成了:
import os,csv,re
my_dict = {}
source_dir = '/home/ubuntu/Desktop/EAST/testing_txts/'
for element in os.listdir(source_dir):
my_dict[element] = []
# print(my_dict)
with open('/home/ubuntu/Desktop/EAST/ground_truth.txt') as f:
reader = csv.reader(f)
for key in my_dict:
for filename in reader:
print(filename)
k = []
k.append(re.findall(r'\d+', str(filename)))
k1,k2 = k[0][0],k[0][1]
k3,k4 = re.findall(r'\d+', key)
if k3 == k1 and k2 == k4:
my_dict[key].append(filename)
print(my_dict)
然而,我的主要问题不是每个键都是因为许多键保持空白而使元素持续存在。
答案 0 :(得分:2)
for element in os.listdir(source_dir):
my_dict[element] = ''
您已将my_dict值初始化为字符串。因此,当您使用追加时,它将创建AttributeError
。因为你不能附加到字符串
方法1 是指值是一个列表,然后在读取时将它们作为字符串连接起来。 append
在这种情况下不会抛出错误
for element in os.listdir(source_dir):
my_dict[element] = []
方法2 是使用字符串连接
my_dict[key] += filename
第2期
我不太确定,但猜测可能是因为关于字典的循环。
with open('/home/ubuntu/Desktop/EAST/ground_truth.txt') as f:
reader = csv.reader(f)
for filename in reader:
print(filename)
k1,k2 = re.findall(r'\d+', str(filename)
my_dict[k1+"-"+k2].append(filename)
print(my_dict)
答案 1 :(得分:0)
import os,csv,re
my_dict = {}
source_dir = 'source'
for element in os.listdir(source_dir):
my_dict[element] = []
# print(my_dict)
with open('readme.txt') as f:
reader = f.readlines()
for key in my_dict:
for line in reader:
k1= re.findall(r'\d+', line)
k1 = k1[0] + k1[1]
key_stripped = key.replace('-','').replace('.txt', '')
if k1 == key_stripped:
my_dict[key].append(line)
print(my_dict)