Я сталкиваюсь с очень странным поведением при написании кода в PyCharm. Подробности приведены ниже:
import csv
ALL_TAGS = set()
def initialize():
third_tag_file = '3rd_name.txt'
tag_file = 'nodes.csv'
# 1. Load 3rd-level tags
with open(third_tag_file, 'r') as f:
for line in f:
if not line:
print("Empty line? " + line)
continue
splited = line.split('\t')
if len(splited) != 2:
raise ValueError("Invalid entry?")
tag = splited[1].strip()
ALL_TAGS.add(tag)
print("3rd tag size:", len(ALL_TAGS))
# 2. Read in CSV file
with open(tag_file, 'r') as f:
csv_reader = csv.reader(f, delimiter='\t')
next(csv_reader, None)
for row in csv_reader:
brand = row[0]
category = row[1]
effect = row[2]
ingredient = row[3]
product = row[4]
alias = row[5]
if brand:
ALL_TAGS.add(brand)
if category:
ALL_TAGS.add(category)
if effect:
ALL_TAGS.add(effect)
if ingredient:
ALL_TAGS.add(ingredient)
if product:
ALL_TAGS.add(product)
if alias:
ALL_TAGS.add(alias)
print("all tag size:", len(ALL_TAGS))
if __name__ == "__main__":
initialize()
Я читаю данные из двух файлов. Второй - CSV, а первый - простой текстовый файл. Логика c очень проста. В текущей форме кода странным является то, что:
if brand:
ALL_TAGS.add(brand)
if category:
ALL_TAGS.add(category)
if effect:
ALL_TAGS.add(effect)
if ingredient:
ALL_TAGS.add(ingredient)
if product:
ALL_TAGS.add(product)
if alias:
ALL_TAGS.add(alias)
Для каждого оператора «if», только первый «if brand» и последний «if alias» завершаются успешно, то есть они добавлен в набор All_Tags. Для всех других операторов if код не входит в локальную область, даже если это не пустые строки. Тем не менее, код работает, как и ожидалось, если я сделаю одно из двух изменений ниже:
1) move the ALL_Tags definition into the initialize() function,
OR
2) comment out all lines on the first reading of the text file, as below:
Commented out:
# 1. Load 3rd-level tags
# with open(third_tag_file, 'r') as f:
# for line in f:
# if not line:
# print("Empty line? " + line)
# continue
# splited = line.split('\t')
# if len(splited) != 2:
# raise ValueError("Invalid entry?")
# tag = splited[1].strip()
# ALL_TAGS.add(tag)
# print("3rd tag size:", len(ALL_TAGS))
Код очень прост, но я не могу понять, почему он не работает, как ожидалось. Я начал использовать PyCharm и иногда обнаруживал, что он не обнаруживает некоторые очень тонкие ошибки, и эта может быть одной из них. Это не дает никакого сообщения об ошибке, но когда я отлаживаю в нем, я обнаружил, что он не работает, как ожидалось. Я не чувствую ошибки в коде.