Python在特定行写入txt文件

时间:2016-02-26 07:51:59

标签: python file-writing writefile

我正在创建一个python库存系统,我需要允许用户输入产品代码并输入数量,软件检查txt文件。它会检查产品是否已找到以及产品是否足够。我试图让我的代码从文本文件中的总数量中减去所需的数量。我只想改变那个产品的数量。任何帮助将不胜感激。谢谢Ben

编辑:

我必须使用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

5 个答案:

答案 0 :(得分:1)

tablib是一个很好的工具,可以用你的例子来处理这些数据(我用.cs文件改变了.txt文件,分隔表)

test.csv

// Define getCurrencyPairs only once
var getCurrencyPairs = function (exchange, callback) {
   CurrencyPair.findAll({where: {exchangeId: exchange.id}}).then(function (pairs) {
       var currencyPairs = [];

       pairs.forEach(function (pair) {
          var data = pair.dataValues;
          currencyPairs.push({
              baseCurrency: data.baseCurrency,
              quoteCurrency: data.quoteCurrency,
              marginPercentage: data.marginPercentage
          });
       });

       callback(currencyPairs);
    });
};

// Start the program-logic
Exchange.all().then(function (result) {
    if (!result)
        return res.json({success: false, error: 'No exchanges records were found.'});

    var exchanges = [];
    var createExchangesObject = function(exchange){
        if(!exchange) // If there is no exchange, we obviously "poped" everything out of result and we are done
            return res.json({success: true, data: exchanges});

        getCurrencyPairs(exchange, function (currencyPairs) {
            exchanges.push({
                id: exchange.stringId,
                name: exchange.name,
                currencyPairs: currencyPairs,
                depositAddress: 'sample address for now'
            });

            // Call your selfe (recursively), with the next result
            createExchangesObject(result.pop());
         });
    }

    createExchangesObject(result.pop());
});

stock.py

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

答案 1 :(得分: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)

编辑:刚刚注意到你有错字/错误:

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

您很可能只需要将最后1更改为y

答案 2 :(得分:0)

如果您使用的是Python2,则可以使data[x][0]类型为str,并且可能是输入的任何类型。如果用户键入'12345670'(或''之间的任何其他产品代码),您的代码就可以正常运行。在Python3中,没关系。

其他一些观点:

  • 您正在打开文件两次。只需执行一次,并在打开后在代码中使用该变量。

  • 您的for块非常复杂。我会像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")

答案 3 :(得分:0)

简短回答:不要

中等回答:您不应该在文本文件的中间更改任何内容。

答案很长: 更改文本文件的唯一简单方法是使用更改编写文件的新副本,并在所有内容都正确写入磁盘时将其重命名。这就是文本编辑所做的。

在您的情况下,由于文本文件看起来格式正确,所有行都是相同的长度,您可以尝试处理它,就像它是二进制直接访问文件一样。但它只有在所有字段始终保持相同长度时才有效。以下是可能导致错误的一些原因:

  • 您正在使用以utf8编码的unicode字符 - e和é似乎同样长,但在utf8中e是一个单字节(代码0x65),而é需要两个字节(0xC3 0xA9)
  • 有人可以使用文本编辑器编辑文件并无意中从字段中删除一些字符,例如写入1.5而不是1.50 =>线条现在更短
  • 有人可以使用文本编辑器编辑文件,并在行尾添加一些空格=> line现在更长了......在文本编辑器中查看它时你看不到它!

TL / DR:如果您需要使用文本文件来保存数据,则必须:

  • 在程序启动时阅读所有内容
  • 将所有内容保存在内存中
  • 在程序结束时将所有内容刷新到磁盘文件,并为用户提供保存工作的方法(命令Save

或者,您可以使用直接访问私有二进制文件或数据库(sqlite很好地集成在Python中),只提供文本导入/导出功能。

答案 4 :(得分: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")