2016-12-17 4 views
0

У меня есть txt-файл, который выглядит ниже, включая 4 строки в качестве примера, и каждая строка строки разделяется ,.Как я могу создать уникальные ячейки списка?

"India1,India2,myIndia  " 
"Where,Here,Here " 
"Here,Where,India,uyete" 
"AFD,TTT" 

https://gist.github.com/anonymous/cee79db7029a7d4e46cc4a7e92c59c50

файл можно скачать здесь

Я хочу, чтобы извлечь все уникальные клетки через всех, output2

India1 
    India2 
    myIndia 
    Where 
    Here 
    India 
    uyete 
    AFD 
    TTT 

Я попытался строку читать строки и напечатайте его «я назову свои данные как df»

myfile = open("df.txt") 
lines = myfile.readlines() 
for line in lines: 
    print lines 
+0

не должны там быть «ТТТ» в единственном выходе клеток ? – rassar

+0

@rassar Да, спасибо, я обновил его – nik

+0

Итак, этот файл '.xls' - это, по сути, обычный текст, содержащий данные? Или это полностью отформатированный документ Excel? – ForceBru

ответ

1

Вариант 1: .csv, .txt Файлы

Родной Python не может читать файлы .xls. Если преобразовать файл (ы) для .csv или .txt, вы можете использовать csv модуль в пределах стандартной библиотеки:

# `csv` module, Standard Library 
import csv 

filepath = "./test.csv" 

with open(filepath, "r") as f: 
    reader = csv.reader(f, delimiter=',') 
    header = next(reader)         # skip 'A', 'B' 
    items = set() 
    for line in reader: 
     line = [word.replace(" ", "") for word in line if word] 
     line = filter(str.strip, line) 
     items.update(line) 

print(list(items)) 
# ['uyete', 'NHYG', 'QHD', 'SGDH', 'AFD', 'DNGS', 'lkd', 'TTT'] 

Вариант 2: .xls, .xlsx Файлы

Если вы хотите чтобы сохранить исходный формат .xls, вам необходимо установить third-party module на номер handle Excel files.

Установка xlrd из командной строки:

pip install xlrd 

В Python:

# `xlrd` module, third-party 
import itertools 
import xlrd 

filepath = "./test.xls" 

with xlrd.open_workbook(filepath) as workbook: 
    worksheet = workbook.sheet_by_index(0)     # assumes first sheet 
    rows = (worksheet.row_values(i) for i in range(1, worksheet.nrows)) 
    cells = itertools.chain.from_iterable(rows) 
    items = list({val.replace(" ", "") for val in cells if val}) 

print(list(items)) 
# ['uyete', 'NHYG', 'QHD', 'SGDH', 'AFD', 'DNGS', 'lkd', 'TTT'] 

Вариант 3: DataFrames

Вы можете обрабатывать CSV и текстовые файлы с пандами DataFrames. See documentation для других форматов.

import pandas as pd 
import numpy as np 

# Using data from gist.github.com/anonymous/a822647a00087abc12de3053c700b9a8 
filepath = "./test2.txt" 

# Determines columns from the first line, so add commas in text file, else may throw an error 
df = pd.read_csv(filepath, sep=",", header=None, error_bad_lines=False) 
df = df.replace(r"[^A-Za-z0-9]+", np.nan, regex=True)  # remove special chars  
stack = df.stack() 
clean_df = pd.Series(stack.unique()) 
clean_df 

DataFrame Выход

0  India1 
1  India2 
2 myIndia 
3  Where 
4  Here 
5  India 
6  uyete 
7  AFD 
8  TTT 
dtype: object 

Сохранить как файлы

# Save as .txt or .csv without index, optional 

# target = "./output.csv" 
target = "./output.txt" 
clean_df.to_csv(target, index=False) 

Примечание: Результаты вариантов 1 & 2 могут быть преобразованы в неупорядоченный, панды столбчатых объекты тоже с pd.Series(list(items)).

Наконец: Как Script

Сохранить любого из трех вариантов выше функции (stack) в файл (с именем restack.py). Сохраните этот скрипт в каталоге.

# restack.py 
import pandas as pd 
import numpy as np 

def stack(filepath, save=False, target="./output.txt"): 
    # Using data from gist.github.com/anonymous/a822647a00087abc12de3053c700b9a8 

    # Determines columns from the first line, so add commas in text file, else may throw an error 
    df = pd.read_csv(filepath, sep=",", header=None, error_bad_lines=False) 
    df = df.replace(r"[^A-Za-z0-9]+", np.nan, regex=True)  # remove special chars  
    stack = df.stack() 
    clean_df = pd.Series(stack.unique()) 

    if save: 
     clean_df.to_csv(target, index=False) 
     print("Your results have been saved to '{}'".format(target)) 

    return clean_df 

if __name__ == "__main__": 
    # Set up input prompts 
    msg1 = "Enter path to input file e.g. ./test.txt: " 
    msg2 = "Save results to a file? y/[n]: " 

    try: 
     # Python 2 
     fp = raw_input(msg1) 
     result = raw_input(msg2) 
    except NameError: 
     # Python 3 
     fp = input(msg1) 
     result = input(msg2) 

    if result.startswith("y"): 
     save = True 
    else: 
     save = False 

    print(stack(fp, save=save)) 

Из его рабочего каталога запустите сценарий через командную строку. Ответьте на запросы:

> python restack.py 

Enter path to input file e.g. ./test.txt: ./@data/test2.txt 
Save results to a file? y/[n]: y 
Your results have been saved to './output.txt' 

Ваши результаты должны напечатать в консоли вы и, возможно, сохранить в файл output.txt. Отрегулируйте любые параметры в соответствии с вашими интересами.

+0

Я обновил решение с помощью параметра DataFrame, используя pandas. 1) Я включил регулярное выражение, чтобы игнорировать специальные символы. Отрегулируйте соответствующим образом. 2) Вы можете преобразовать список практически в любой формат. Непонятно, как вы хотите отображать свой результат (например, в REPL или в новом файле). Раздел DataFrame включает оба варианта и работает с csv. 3) Эти решения предполагают, что у вас есть чистые данные. Я заметил проблему с вашим последним txt-файлом; в первой строке требовалась конечная запятая 'India1, India2, myIndia,'. Если вы получаете ошибки или усеченные данные, рассмотрите формат csv, который является более надежным. – pylang

+0

Я действительно хочу ваше решение, но проблема в том, что он не генерирует никаких выходных данных для меня. Я использую последний код. Я использую общие данные выше (в моем вопросе). Он работает, но не выводит, нет ошибки. Что может быть причиной? Я использую Mac и Python 2.7 – nik

+0

Вы искали? – nik

0

Я не дам вам весь код, но я дам вам некоторые идеи.

Во-первых, вам нужно прочитать все строки файла:

lines = open("file.txt").readlines() 

Затем извлечь данные из каждой строки:

lines = [line.split(",") for line in lines] 

Вы можете создавать комбинации с itertools.combinations. Для каждой строки напечатайте комбинации элементов линии.

Вы можете получить уникальные элементы с set, если вы не заботитесь о порядке элементов. Перед использованием set вы должны сначала свернуть список lines, возможно, используя itertools.chain.from_iterable.

+0

почему ты голосуешь за мой вопрос? если бы я знал, как это сделать, я бы не спросил – nik

+0

@nik: Просить других написать код для вас не единственный и не обязательно лучший способ узнать. У вас было, по крайней мере, два человека, которые рассказывают вам о шагах, нужно, поэтому я предлагаю вам потратить время на выяснение, как их сделать, - возможно, прочитав соответствующую документацию или найдя учебник где-нибудь (их много). – martineau

+1

@nik, кто, _me_? Я не ответил на ваш вопрос! – ForceBru

1

Если файл stack.txt выглядит следующим образом (т.е. он сохраняется в виде .txt файла):

"India1,India2,myIndia  " 
"Where,Here,Here " 
"Here,Where,India,uyete" 
"AFD,TTT" 

Решение:

from collections import OrderedDict 

with open("stack.txt", "r") as f: 
    # read your data in and strip off any new-line characters 
    data = [eval(line).strip() for line in f.readlines()] 
    # get individual words into a list 
    individual_elements = [word for row in data for word in row.split(",")] 
    # remove duplicates and preserve order 
    uniques = OrderedDict.fromkeys(individual_elements) 
    # convert from OrderedDict object to plain list 
    final = [word for word in uniques] 

Чтобы получить нужный столбчатый вывод:

print("\n".join(final)) 

Которые доходы:

India1 
India2 
myIndia  
Where 
Here 
India 
uyete 
AFD 
TTT 
+1

Это выглядит как прекрасный ответ, но согласно обновлению вам не нужно пропускать первую строку. – jmilloy

+0

Я этого не видел .. Плюс новый вход полностью. Я обновил решение выше. – blacksite

0

Ваш код для чтения текстового файла по строкам в порядке. Таким образом, вы все равно должны

  1. Сплит каждую строку в «ячейки»
  2. Удалить дублирует

Вы можете разбить каждую строку в клетки с помощью split

line.split(',') 

И вы хотите, чтобы удалить пробел, поэтому я бы strip каждую ячейку:

[value.strip() for elem in line.split(',')] 

И вы можете удалить дубликаты set

set(cells) 

Наконец, я считаю, что лучше использовать with (контекст менеджера) при чтении файлов.Собираем все вместе:

with open('df.txt', 'r') as f: 
    cells = [] 
    for line in f: 
     cells += [value.strip() for value in line.split(',')] 

cells = list(set(cells)) 

Если вы хотите быть более компактным, вы можете сделать это в одном списке понимание:

with open('df.txt', 'r') as f: 
    cells = list(set([value.strip() for line in f for value in line.split(','])) 
+0

Я получаю синтаксическую ошибку 'SyntaxError: недействительный синтаксис' Я использую последний код как компактный – nik

+0

Да, вы правы, есть опечатка. Посмотрите, можете ли вы это понять - отсутствующая скобка. – jmilloy