2016-02-26 15 views
0

Я создаю систему запаса python, в которой мне нужно разрешить пользователю вводить код продукта и вводить его количество, а программное обеспечение проверяет файл txt. Он проверяет, найден ли продукт и достаточно ли его. Я застреваю, пытаясь заставить мой код вычесть необходимое количество из общего количества в текстовом файле. Я только хочу изменить количество этого одного продукта. Любая помощь будет оценена. Благодаря БенPython пишите в txt файл по определенной строке

Edit:

Я должен использовать TXT, поскольку это является частью дизайна кратко.

x = 10 
y = 0 
n = 1 
data = [line.strip().split() for line in open("Untitled.txt")] 
code = input("Please enter Product Code?") 
quantity = input("How many of these do you need?") 


for num in range(0,10): 
    if data[x][0] == code: 
     n = 0 
     y = x 
    x = x - 1 

if n == 0: 
    if data[y][3] >= quantity: 
     print("Product in stock") 

     old = int(data [y][3]) 
     quantity = int(quantity) 
     new = old - quantity 
     new = str(new) 
     data[y][3] = new 
    else: 
     print("Product out of stock") 
else: 
    print("Product not found") 

Это мой TXT файл

Code  Description Price Quantity 
12345670 testitem 1.45 34 
12345671 testitem 1.45 34 
12345672 testitem 1.45 34 
12345673 testitem 1.45 34 
12345674 testitem 1.45 34 
12345675 testitem 1.45 34 
12345676 testitem 1.45 34 
12345677 testitem 1.45 34 
12345678 testitem 1.45 34 
12345679 testitem 1.45 34 
12345680 testitem 1.45 34 
+2

Могу ли я спросить, почему вы сохраняете его в текстовом файле?Трудно определить столбец для записи и меньше подвержен ошибкам, если вы пишете его в базе данных. –

+0

Зачем использовать TXT-файл? –

+0

Это часть краткого описания проекта –

ответ

0

Все, что вам нужно сделать, это сделать это в обратном направлении:

data = [line.strip().split() for line in open("Untitled.txt")] 

так что каждая строка в данных, соединенных "\n" и каждый элемент линия, соединенная ... вкладкой? (.split() без аргументов может разделить на несколько различных символов)

new_text = "\n".join("\t".join(line) for line in data) 

Я вижу, вы открываете файл, как только для чтения в данных и один для r+, но это нужно только быть открыт для строки кода что она будет написана на:

with open("Untitled.txt","w") as f: 
    f.write(new_text) 

Edit: только что заметил, у вас есть опечатка/ошибка:

if data[y][3] ...: 
    ... 
    old = ...data [y][3].. 
    ... 
    data[1][3] = new 

это вполне возможно, что вы просто нужно изменить последний 1 к y

+0

Нет, я хочу только заменить количество –

+0

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

+0

иначе вы уже заменяете количество в 'data', все Осталось переписать файл, который я предполагал, может быть, я ошибся? –

0

Если вы используете python2, вы compairing data[x][0], какой тип является str с потенциально любого рода типа для ввода. Ваш код работает хорошо, если пользователь вводит '12345670' (или любой другой код продукта между ''). В Python3 это нормально.

Некоторые другие точки:

  • Вы открываете файл дважды. Просто сделайте это один раз и используйте переменную в своем коде после открытия.

  • Ваш for блок довольно сложный imo. Я бы сделал это как for x in range(1, len(data)), но если вы в порядке, это работает.

  • Последний. После этого вы не записываете в файл. Вы должны написать свой файл data, чтобы его обновить.

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

Редактировать

Для части записи, здесь ваш код отредактирован (кредиты Tadhg McDonald-Jensen)

x = 10 
y = 0 
n = 1 
edit = open("data.txt","r+") 
data = [line.strip().split() for line in open("data.txt")] 
code = input("Please enter Product Code?") 
quantity = input("How many of these do you need?") 

for num in range(0,10): 
    if data[x][0] == code: 
     n = 0 
     y = x 
    x = x - 1 

if n == 0: 
    if data[y][3] >= quantity: 
     print("Product in stock") 

     old = int(data [y][3]) 
     quantity = int(quantity) 
     new = old - quantity 
     new = str(new) 
     data[y][3] = new 
     with open("data.txt", "w") as f: 
      new_text = "\n".join("\t".join(line) for line in data) 
      f.write(new_text) 
    else: 
     print("Product out of stock") 
else: 
    print("Product not found") 
+0

«Но будьте осторожны. Первый элемент, то есть тот, который находится в индексе 0, является заголовками столбцов. " Вот почему в коде х начинается с 10 и уменьшается и останавливается на 1. – Lafexlos

+0

Мне нужно использовать txt, поскольку он является частью краткого описания дизайна, но спасибо, я попробую его позже. –

+0

также 'input' в python 3 работает как' raw_input 'в python 2, поэтому ваш главный признак недействителен, если @ ben.garman использует python3 –

0

Короткий ответ: DO NOT.

Средний ответ: Вам нечего менять в середине файла .

Длинный ответ: Единственный надежный способ изменить текстовый файл - написать новую копию файла с изменением и переименовать его в конце, когда все было правильно записано на диск. Это то, что делают текстовые редакторы.

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

  • вы используете символы Юникода, закодированные в utf8 - еий кажутся одинаково долго, но в utf8 е один единственные байты (код 0x65), а é необходимы два байта (0xC3 0xA9)
  • кто-то может редактировать этот файл с помощью текстового редактора и случайно удаляет некоторые символы из поля, например, написание 1,5 вместо 1,50 => линия теперь короче
  • кто-то может редактировать этот файл с помощью текстового редактора и добавляет случайно некоторые белые пробелы в конце строки => линия теперь длиннее ... и вы не видите ее, глядя на нее в текстовом редакторе!

TL/DR: если вам необходимо использовать текстовый файл для сохраняющихся данных, вы должны:

  • читать все при запуске программы
  • держать все в памяти
  • вровень все, к файлу диска на конце программы и предоставить пользователям возможность сохранить их работу (команда Save)

В качестве альтернативы, вы можете использовать частный двоичный файл прямого доступа или базу данных (sqlite хорошо интегрирован в Python) и просто предоставить функцию импорта/экспорта текста.

1

tablib является отличным инструментом для манипулирования таких данных с вами, например (я изменил .txt файл CSV, сведенный в таблице разделены)

test.csv

Code Description Price Quantity 
12345670 testitem 1.45 34 
12345671 testitem 1.45 34 
12345672 testitem 1.45 34 
12345673 testitem 1.45 34 
12345674 testitem 1.45 34 
12345675 testitem 1.45 34 
12345676 testitem 1.45 34 
12345677 testitem 1.45 34 
12345678 testitem 1.45 34 
12345679 testitem 1.45 34 
12345680 testitem 1.45 34 

stock.py

# coding=utf-8 
#! /usr/bin/env python 
from tablib import Dataset 

# load data from the tsv 
with open("./test.csv") as fin: 
    imported_data = Dataset().load(fin.read()) 

code = input("Please enter Product Code?") 
quantity = int(input("How many of these do you need?")) 

# code is uniq find the first index 
i = imported_data["Code"].index(code) 
new_qt = int(imported_data[i][3]) - quantity 
# tuple manipulation, so replace the line, item affection not possible 
if new_qt >= 0: 
    imported_data[i] = imported_data[i][:-1] + (str(new_qt),) 
else: 
    imported_data[i] = imported_data[i][:-1] + ("0",) 

export = imported_data.tsv 
# newline="" avoid add new lines 
with open("./test.csv", "w", newline="") as fout: 
    fout.write(export) 
+0

wow мне нравится, что вы можете просто сделать' imported_даты ["Code"] 'to получите столбец как список. Я определенно буду смотреть в 'tablib', но я все еще думаю, что это немного перебор для вопроса, поскольку он не имеет никакого отношения к исходному коду, о котором идет речь. –

0

Рабочий код:

x = 10 
y = 0 
n = 1 
data = [line.strip().split() for line in open("Untitled.txt")] 
code = input("Please enter Product Code?") 
quantity = input("How many of these do you need?") 

for num in range(0,10): 
    if data[x][0] == code: 
     n = 0 
     y = x 
     print("Data ",data[x][0]) 
    x = x - 1 

if n == 0: 
    if data[y][3] >= quantity: 
     print("Product in stock") 

     old = int(data [y][3]) 
     quantity = int(quantity) 
     new = old - quantity 
     data[y][3] = str(new) 
     print(data) 
     file = open("Untitled.txt", "w") 
     for item in data: 
      print>>file, (', '.join(item)) 
     file.close(); 
    else: 
     print("Product out of stock") 
else: 
    print("Product not found")