Я читаю файл csv, который выглядит так:
[152.60115606936415][152.60115606936415, 13181.818181818182][152.60115606936415, 13181.818181818182, 1375055.330634278][152.60115606936415, 13181.818181818182, 1375055.330634278, 89.06882591093118]
что я хочу сделать, так это удалить символы ([,] и пробелы в новую строку) и записать это в мой новый текстовый файл fil
import csv
to_file =open("t_put.txt","w")
with open("t_put_val.20181026052328.csv", "r") as f:
for row in (list(csv.reader(f))):
value2= (" ".join(row)[1:-1]) #remove 3 first and last elements
value = value2.replace(" ","\n")# replace spaces with newline
value3 = value.replace("]["," ") # replace ][
value4 = value3.replace(" ","\n")
print(value4)
# st = str(s)
to_file.write(value4)#write to file
to_file.close()
С помощью этого кода я могу удалить символы, но все равно появляются дубликаты. Я думал использовать метод set (), но он не работает должным образом или просто распечатывает четыре последние цифры, но может не работать для большего набора данных
мой текущий результат при запуске кода: 573956.3182527301 573956.3182527301 2090614221.115538, как вы видите, он просто печатает все, а не удаляет дубликаты 573956.3182527301 2090614221.115538 92.26467847157502 573956.3182527301 2090478476142502
есть достаточно ответов, чтобы подумать, где вы можете проголосовать и принять тот, который кажется подходящим, чтобы удалить его из очереди без ответов.
обновил ответ, как вы определили в комментарии, надеюсь, что это поможет.
да спасибо за ваше время
@pygo Вы буквально посмотрели на мой ответ и скопировали мой метод в свое редактирование. Пока людям помогают и ОП получает ответ, я не возражаю, но продолжать это не уважительно.
@leeym, первоначально OP спросил о методе set (), который я предлагаю в ответе, когда позже он рассказал о порядке, поэтому я взял orderdict как модуль, а не ваш ответ вообще, если вы видите мой ответ, который не соответствует вашему , говоря о модуле, который может быть использован кем угодно, вы не можете сказать свои методы, пока логика не будет вашей, Более того, я сказал OP искать ваше решение и даже проголосовал за ваш ответ ... я боюсь быть уважительной практикой здесь !
Вы можете использовать свой скрипт указанным ниже способом в сочетании с командной строкой linux следующим образом: Если вы скомпилируете свой скрипт, ответ будет:
./yourscript.py
152.60115606936415
152.60115606936415
13181.818181818182
152.60115606936415
13181.818181818182
1375055.330634278
152.60115606936415
13181.818181818182
1375055.330634278
89.06882591093118
Но если вы используете трубы в оболочке и записываете свой вывод в файл, то дубликаты можно легко удалить следующим образом:
./yourscript.py |sort|uniq > yourresultfile
Если вы увидите результаты своего файла, он будет выглядеть как
cat yourresultfile
13181.818181818182
1375055.330634278
152.60115606936415
89.06882591093118
Таким образом вы можете удалить дубликаты из вашего файла.
Итак, если вам нужен питонический способ для этого, то ниже приведен довольно глупый способ достижения желаемого результата:
#!/usr/bin/python
import json
with open('input_file.txt', 'r') as myfile:
data=myfile.read().replace('\n', '')
str1= data.replace('[','')
str2= str1.replace(']',',')
list1=str2.split(',')
list2=list(set(k))
list3=[x.strip() for x in list2 if x.strip()]
list4=[float(i) for i in list3]
with open('out_put_file.txt','w') as f:
f.write(json.dumps(list4))
Файл out_put_file.txt содержит следующие выходные данные:
[13181.818181818182, 1375055.330634278, 89.06882591093118, 152.60115606936415]
OP ищет путь в Python, а не в Linux, так что это не имеет значения.
Да, это работает, но я ищу способ использовать Python в моем коде. Любой способ выполнить эту команду на Python?
Проверьте последнее решение, предоставленное мной.
Разделив их на ']', вы можете сгруппировать каждый из списков, находящихся внутри csv.
# Open up the csv file
with open("t_put_val.20181026052328.csv", "r") as f_h:
rows = [row.lstrip('[').split(", ")
# For each line in the file (there's just one)
for line in f_h.readlines()
# Dont' want a blank line
if not len(line) == 0
# Split the line by trailing ']'s
for row in line.split(']')
# Don't want the last blank list
if not len(row) == 0
]
# Print out all unique values
unique_values = set(item for row in rows for item in row)
[print(value) for value in unique_values];
# Output
with open("t_put.txt", 'w') as f_h:
f_h.writelines('%s\n' % ', '.join(row) for row in rows)
set
- это неупорядоченная структура данных.
Лучший способ преобразовать вывод String в объект списка, а затем использовать метод python set()
, который означает для этого:
>>> my_int = [152.60115606936415, 13181.818181818182, 152.60115606936415, 13181.818181818182, 1375055.330634278, 152.60115606936415]
Вы можете использовать набор непосредственно для списка, чтобы удалить дубликат.
>>> set(my_int)
{152.60115606936415, 13181.818181818182, 1375055.330634278}
Однако, если вы не хотите выбирать выше и предпочитаете вывод списка, вы можете выбрать, как показано ниже ...
>>> list(set(my_int))
[152.60115606936415, 13181.818181818182, 1375055.330634278]
collections.OrderedDict
..Согласно беседе, требуемый вывод должен быть в упорядоченном виде, следовательно, с использованием OrderedDict
для сохранения порядка набора данных.
from collections import OrderedDict
import csv
to_file =open("ttv","w")
with open("tt", "r") as f:
for row in (list(csv.reader(f))):
value2= (" ".join(row)[1:-1]) #remove 3 first and last elements
value = value2.replace(" ","\n")# replace spaces with newline
value3 = value.replace("]["," ") # replace ][
value4 = value3.replace(" ","\n")
value4 = OrderedDict.fromkeys(value4.split())
#value4 = sorted(set(value4.split()))
for line in value4:
line = line.split(',')
for lines in line:
new_val = lines
print(new_val)
to_file.write(new_val + '\n')#write to file
to_file.close()
результат:
152.60115606936415
13181.818181818182
1375055.330634278
89.06882591093118
Я вижу, что результат находится в неправильном порядке, это просто для сортировки?
но 152.60115606936415 читается первым из файла, но появляется почти последним: 152.60115606936415 13181.818181818182 1375055.330634278 89.06882591093118 Я использую этот результат для построения графика
Если я прав, предполагая, что вы просто хотите записать каждое уникальное значение в новую строку в вашем выходном файле, это также сохранит исходный порядок:
from collections import OrderedDict
with open('t_put_val.20181026052328.csv', 'r') as infile, open('t_put.txt', 'w') as outfile:
data = infile.read()
# List of characters to replace
to_replace = ['[', ']', ' ']
for char in to_replace:
if char in data:
data = data.replace(char, '')
unique_list = list(OrderedDict.fromkeys(data.split(',')))
for i in unique_list:
outfile.write(i + '\n')
Выдает это в текстовом файле:
152.60115606936415
13181.818181818182
1375055.330634278
89.06882591093118
Можете ли вы показать свой текущий результат, чтобы воспроизвести ответ ..