Удалить символы и дубликаты из файла csv и записать в новый файл

Я читаю файл 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 (), но он не работает должным образом или просто распечатывает четыре последние цифры, но может не работать для большего набора данных

Можете ли вы показать свой текущий результат, чтобы воспроизвести ответ ..

Karn Kumar 27.10.2018 09:20

мой текущий результат при запуске кода: 573956.3182527301 573956.3182527301 2090614221.115538, как вы видите, он просто печатает все, а не удаляет дубликаты 573956.3182527301 2090614221.115538 92.26467847157502 573956.3182527301 2090478476142502

user3768971 27.10.2018 09:38

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

Karn Kumar 27.10.2018 11:25

обновил ответ, как вы определили в комментарии, надеюсь, что это поможет.

Karn Kumar 27.10.2018 12:10

да спасибо за ваше время

user3768971 27.10.2018 12:34
meta.stackexchange.com/q/21643/405735
user1394 27.10.2018 14:18

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

user1394 27.10.2018 20:10

@leeym, первоначально OP спросил о методе set (), который я предлагаю в ответе, когда позже он рассказал о порядке, поэтому я взял orderdict как модуль, а не ваш ответ вообще, если вы видите мой ответ, который не соответствует вашему , говоря о модуле, который может быть использован кем угодно, вы не можете сказать свои методы, пока логика не будет вашей, Более того, я сказал OP искать ваше решение и даже проголосовал за ваш ответ ... я боюсь быть уважительной практикой здесь !

Karn Kumar 28.10.2018 05:13
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
8
71
4

Ответы 4

Вы можете использовать свой скрипт указанным ниже способом в сочетании с командной строкой 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, так что это не имеет значения.

Karn Kumar 27.10.2018 09:14

Да, это работает, но я ищу способ использовать Python в моем коде. Любой способ выполнить эту команду на Python?

user3768971 27.10.2018 09:42

Проверьте последнее решение, предоставленное мной.

Ammar Sabir Cheema 27.10.2018 11:00

Разделив их на ']', вы можете сгруппировать каждый из списков, находящихся внутри 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

Я вижу, что результат находится в неправильном порядке, это просто для сортировки?

user3768971 27.10.2018 11:30

но 152.60115606936415 читается первым из файла, но появляется почти последним: 152.60115606936415 13181.818181818182 1375055.330634278 89.06882591093118 Я использую этот результат для построения графика

user3768971 27.10.2018 11:43

Если я прав, предполагая, что вы просто хотите записать каждое уникальное значение в новую строку в вашем выходном файле, это также сохранит исходный порядок:

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

Другие вопросы по теме