почему в выходной строке три двойных кавычки - PullRequest
0 голосов
/ 12 марта 2020

Я довольно новичок в python. Следовал советам здесь , пытаясь заставить строку выводить с одиночным набором двойных кавычек (например, "my_string"), но она всегда печаталась так: """my_string"""

Есть идеи почему?

Я пытался: '"' + my_string + '"' и f'"{self.args["name"]}"' и str(my_string) и "\"" + my_String + "\"", но такое же поведение:

"""my_string"""

Фрагмент кода:

def print_out(self):
    self.args = {}
    self.args["name"] = 001
    self.bla = 1
    self.tra = 0
    self.val = 0.12445
    with open("my_file", "w") as fout:
          tsv = csv.writer(fout, delimiter="\t")
          tsv.writerow(["name", "bla", "tra", "hehe"])
          tsv.writerow(
                    [f'"{self.args["name"]}"', self.bla, self.tra, round(self.val, 2)]
          )

В приведенном выше примере self.args["name"] печатается как """001"""

Спасибо

Ответы [ 2 ]

3 голосов
/ 12 марта 2020

CSV-файлы бывают разных диалектов. В своей простейшей форме они представляют собой просто список строк, разделенных разделителем. В этом случае вы используете вкладку.

Проблемы начинаются, когда вы хотите значение, которое содержит разделитель; тогда вы должны каким-то образом покинуть вкладку, чтобы парсер не рассматривал ее как таковую. Один из способов сделать это - заключить в кавычки все поле.

Но теперь, как вы включаете кавычку в значение поля? По умолчанию вы заключаете в кавычки поле и экранируете буквальные кавычки, удваивая их.

Таким образом, "001" становится """001""", потому что значение "001" должно быть заключено в кавычки, и каждый литерал " получает заменено на "". Парсер (использующий этот диалект по умолчанию) увидит "..." и лишит большинство внешних кавычек, а затем заменит каждую оставшуюся пару кавычек одинарной кавычкой, чтобы получить "001" обратно из """001""".

Существует несколько способов отключить цитирование двойных кавычек, и какой из них вам может понадобиться, зависит от того, какой тип данных вы используете. Один простой способ - просто установить аргумент quotechar на None при создании средства записи CSV.

      tsv = csv.writer(fout, delimiter="\t", quotechar=None)

См. Диалекты и параметры форматирования для получения дополнительной информации о том, как именно данные заключенный в кавычки и / или экранированный в файле CSV.


Демонстрация:

>>> f = csv.writer(sys.stdout, delimiter="\t")
>>> f.writerow(["001", 3])
001 3
7
>>> f.writerow(['"001"', 3])
"""001"""   3
13
>>> f = csv.writer(sys.stdout, delimiter="\t", quotechar=None)
>>> f.writerow(["001", 3])
001 3
7
>>> f.writerow(['"001"', 3])
"001"   3
9

(Каждый вызов f.writerow показывает данные, записанные в стандартный вывод, с последующим их возвратом значение.)

0 голосов
/ 12 марта 2020
f'"{self.args["name"]}"'

Эта строка содержит встроенные двойные кавычки, поэтому вы говорите csv написать буквальное значение "1".

Однако csv достаточно умен, чтобы знать, что если он пишет просто "1" в файле, тогда будущие читатели файла могут запутаться - это должно быть просто 1 и в нем просто есть кавычки, или это буквально значение "1"?

Поскольку вы сказали csv написать литерал "1", csv использует тройные кавычки в качестве специального синтаксиса.

Предположительно, вы намеревались использовать вместо этого f'{self.args["name"]}' без дополнительного уровня цитирования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...