Форум сайта python.su
py.user.next, записала, таким образом:
rdn = csv.reader(fhand, delimiter=';') for i in rdn: print(', '.join(i))
import csv import string fname = input("Enter a file name: ") outputfile = "out.csv" try: fhand = open(fname, mode='r', newline='') fcopy = open(outputfile, mode='w') except: print ("File don’t exist: ", fname) exit() rdn = csv.reader(fhand, delimiter=';') for i in rdn: print(', '.join(i)) fhand.seek(0) rdn = csv.reader(fhand, delimiter=';') for title in list(rdn)[:1]: print("This file has parameters: ") print(title) ''' rdn = csv.reader(fhand, delimiter=';') i = ' '.join(list(rdn)[0]) print(i) ''' while True: print("---------------------------------------------------------") print("If you want to EXIT this program then type - done") param = input("Enter the required parameter: ") if param == "done": break if not (param in title): print("This parameter doesn't exist. Please try again") exit() rdn = csv.reader(fhand, delimiter=';') print("This file has parameters: ") print(title) titleIndex = title.index(param) print(titleIndex) fhand.seek(0) wrtr = csv.writer(fcopy, dialect='excel') for row in rdn: wrtr.writerow(row) print("---------------------------------------------------------") fhand.close() fcopy.close()
Отредактировано whoami217 (Сен. 10, 2017 12:15:17)
Офлайн
Да, дело серьёзное. Придётся, видимо, твой код всё-таки прочитать…
Короче, неправильно у тебя всё в плане логики, надо всё по новой делать.
Во-первых, с какого перепугу оно там выходит вообще из программы, если параметр введён неверный? Во-вторых, с чего ты взяла, что exit() - это правильный способ выхода из программы? exit() применяется только в интерпретаторе, когда сидишь в нём руками. Для выхода из программы применяется функция sys.exit() - совсем другая функция. И то выход посреди программы не рекомендуется использовать, потому что программа может стать частью большей программы, которая не должна будет выходить где-то там внутри своего кода. Там нужно поставить continue, чтобы цикл заново пошёл (перешёл на следующий шаг).
whoami217Может, тебе функции попробовать? Задание вполне прилично смотрится и напрашивается на функции.
1. спрашивали название файла, который нужно пропарсить,
2. добавляли новый файл csv, куда необходимые нам колонки вставлялись в файл,
3. спрашивали, какие параметры мы хотим получить в новом файле txt,
4. вводили параметры,
5. и записывали эти колонки с параметрами и их значениями в новый файл.
Отредактировано py.user.next (Сен. 10, 2017 12:36:45)
Офлайн
py.user.next, насчёт continue я поняла, обязательно применю. Насчёт функций. Функции для меня достаточно тяжёлые для понимания, так как не всегда понятно что нужно возвращать в return. Но я попытаюсь сделать через функции.
Тебе нужно ввести все имена полей, а потом, когда они уже все введены, писать в файл вывода их, выбирая из файла ввода.
for row in rdn: wrtr.writerow(row)
Офлайн
whoami217Вот код примерный, как должно это на функциях смотреться
Функции для меня достаточно тяжёлые для понимания, так как не всегда понятно что нужно возвращать в return. Но я попытаюсь сделать через функции.
#!/usr/bin/env python3
# создаёт матрицу
# заменяет в ней одно число на другое
import random
def input_values():
m = int(input('Enter m: '))
n = int(input('Enter n: '))
f = int(input('Enter f: '))
return m, n, f
def create_matrix(rows, cols):
matr = [[random.randint(-10, 10) for j in range(cols)]
for i in range(rows)]
return matr
def print_matrix(pref, matr):
print(pref, end='')
rows, cols = len(matr), len(matr[0])
for i in range(rows):
for j in range(cols):
print('{0:5}'.format(matr[i][j]), end='')
print()
def process_matrix(matr, num, to):
rows, cols = len(matr), len(matr[0])
i = 0
while i < rows:
j = 0
while j < cols:
if matr[i][j] != num:
matr[i][j] = to
j += 1
i += 1
return matr
def main():
m, n, f = input_values()
matr = create_matrix(m, n)
print_matrix('was:\n', matr)
process_matrix(matr, f, 0)
print_matrix('new:\n', matr)
if __name__ == '__main__':
main()
whoami217Нужна функция получения названий полей. Потом, когда она получила и вернула названия, они передаются дальше в другую функцию. А она уже их берёт и использует для ввода нужных полей (проверка на наличие поля). Когда подходящие поля введены, они возвращаются из функции и дальше они передаются в другую функцию, которая уже из файла ввода выбирает только по ним и, в идеале, возвращает итератор по строкам, в которых только выбранные поля. А дальше этот итератор берётся и подаётся в следующую функцию, которая из него пишет в файл вывода. То есть каждая функция отвечает за своё дело какое-то небольшое. На матрице посмотришь: функция main() управляет функциями готовыми, передавая данные и результаты между ними, а каждая функция выполняет только свою мелкую, но конкретную задачу.
Ввести все имена полей, которые мне нужно получить в out.csv? При этом указав количество этих полей?
Отредактировано py.user.next (Май 24, 2019 02:08:09)
Офлайн
whoami217тут csv не особо и нужен ЕЯПП
Также можете предложить свой альтернативный код.
while True: f_in = input("Исходный файл? ") try: with open(f_in) as f: lines = f.readlines() break except Exception as e: print(str(e)) title = [ i.strip() for i in lines[0].split(';') if i.strip()] #print(title) flag = True while flag: print('Колонки исходного файла: ',' '.join(title)) val = input('Введите колонки для выходного файла(через пробел) ') hdr = [i.strip() for i in val.split() if i.strip()] flag = False for i in hdr: if not i in title: print('Неверные данные:',i) flag = True indexes = [] for i in hdr: indexes.append(title.index(i)) #print(hdr,indexes) f_out = input("Выходной файл? ") f = open(f_out,'w') f.write(';'.join(hdr) + '\n') for line in lines[1:]: l = [i.strip() for i in line.split(';') if i.strip()] tmp = [] for i in indexes: tmp.append(l[i]) f.write(';'.join(tmp) + '\n') f.close()
Офлайн
py.user.next, спасибо за пример работы с функциями.
Офлайн
vic57, вы прекрасно меня поняли. Спасибо за предоставленный код. Проверила, что он рабочий. Теперь осталось разобрать весь код построчно, поскольку есть моменты, в которые сложно вникнуть сразу.
Офлайн
whoami217, добавил комментарии
while True: f_in = input("Исходный файл? ") try: with open(f_in) as f: lines = f.readlines()#читаем файл в list break except Exception as e: print(str(e)) title = [ i.strip() for i in lines[0].split(';') ]# заголовки входного файла(list) #print(title) flag = True while flag: print('Колонки исходного файла: ',' '.join(title)) val = input('Введите колонки для выходного файла(через пробел) ') hdr = [i.strip() for i in val.split() ] # заголовки выходного файла (list) flag = False for i in hdr: if not i in title: print('Неверные данные:',i) flag = True indexes = [] for i in hdr: indexes.append(title.index(i)) #print(hdr,indexes) f_out = input("Выходной файл? ") f = open(f_out,'w') f.write(';'.join(hdr) + '\n') for line in lines[1:]: #данные l = [i.strip() for i in line.split(';') ]# разбиваем строку по delimiter в список, удаляем перевод строки tmp = []# пустой список for i in indexes: tmp.append(l[i]) # заносим значения по индексам в список f.write(';'.join(tmp) + '\n')# объединяем list в строку по delimiter, добавляем перевод строки f.close()
Отредактировано vic57 (Сен. 10, 2017 16:11:36)
Офлайн
whoami217, лучше на функциях делай. Конечно, хочется всё сделать быстро, но программирование - это не та область где нужно торопиться. Потеряешь просто в десять раз больше времени и, главное, не сделаешь ничего. Вот это программирование.
whoami217У тебя на входе csv-файл. Это что значит? Это значит, что у него прямо внутри поля может быть разделитель в проэкранированном виде. То есть это точка с запятой, но прямо внутри поля, в виде “123;456”. Поэтому csv никогда не разбирается как текст, потому что вот такие моменты бывают - когда разделитель может оказаться совсем не разделителем.
Проверила, что он рабочий.
whoami217Конечно! Так там ещё и ошибки могут быть, которые не найдёшь при чтении из-за запутанности кода, но которые всплывут прямо при работе программы, когда уже не будет времени её менять. Сломается программа прямо посреди работы, для которой она предназначалась. Поэтому код должен быть читаемым (легко понимаемым), чтобы ошибки было видно сразу.
в которые сложно вникнуть сразу
vic57Вот ошибка. По RFC там должны быть CRLF везде, а тут только LF ставится. Заметил он ошибку? Нет, не заметил. А что типа, оно же выглядит похоже. А потом оно где-нибудь вылезет: в какой-нибудь винде в какой-нибудь программе напишет весь файл в одну строку. Да в простом блокноте даже виндовом открой csv-файл и вот этот файл - и увидишь квадратики в одной строке вместо нескольких строк.f.write(';'.join(hdr) + '\n')
Отредактировано py.user.next (Сен. 14, 2017 09:44:22)
Офлайн