传递给txt文件的唯一行

时间:2017-07-17 20:31:21

标签: python python-2.7

我尝试在对特定值进行网络报废后将唯一行传递给txt文件。所以txt文件涉及以下内容:

Current date                        Amount Gained
15/07/2017                                     660
16/07/2017                                    -200
17/07/2017                                     300

所以基本上我想做的是编写一个脚本,只允许我不想要任何重复的唯一行,因为值每天都在变化。因此,如果用户偶然在一天内运行脚本两次,我不希望在我的txt文件中出现重复的行,因为它会影响我的数据分析中的进一步计算。所以这是我目前的功能,我想知道我应该做些什么修改?

def Cost_Revenues_Difference():

    nrevenue = revenue
    ndifference = difference
    dateoftoday = time.strftime('%d/%m/%Y')
    Net_Result.append(nrevenue)

    with open('Net_Result.txt', 'a') as ac:
        for x in Net_Result:
            ac.write('\n' + dateoftoday + ' ' + str(Net_Result))


Cost_Revenues_Difference()

3 个答案:

答案 0 :(得分:0)

有很多方法可以做到这一点。下面介绍两种替代方法。

1(此alt更新值)

一种是将它们放在一个字符串中,键和值成对,并使用json库导入和导出数据(好处:非常常见的数据结构)。

import json

with open("test.json") as f:
    data = json.loads(f.read())

data["18-05-17"] = 123

with open("test.json", "w") as f:
    json.dump(data,f,indent=4)

Test.json

{
    "18-05-17": 123,
    "17-05-17": 123
}

作为字典,只能保存您不会有重复的唯一键。

2(此alt不会更新值)

另一个解决方案是将当前日期放在文件名中:

import datetime
import os

today = datetime.datetime.today().strftime("%y%m%d")
filedate = [i for i in os.listdir() if i.startswith("Net_result")][0]

# If today is different than the filedate continue
if today != os.path.splitext(filedate)[0].split("_")[-1]:
    # code here
    with open(filedate, "a") as f:
        f.write('\n' + dateoftoday + ' ' + str(Net_Result))

    # rename
    os.rename(filedate,"Net_result_{}.csv".format(today))

你可以从一个带有昨天日期的文件(" Net_result_170716")开始,代码将检查文件结尾是否与今天(它是)不同并添加新值,重命名文件并保存。再次运行代码不会做任何事情(甚至不打开文件)。

答案 1 :(得分:0)

您可以在以下日期之前将文件的所有数据读入列表:

with open('Net_Result.txt') as f:
    content = f.readlines()

# you may also want to remove whitespace characters like `\n` at the end of each line
content = [x.strip() for x in content] 

然后检查您要添加的行是否在您的内容列表中不存在,如果没有,请将该行添加到文件中:

newLine = dateoftoday + ' ' + str(Net_Result);
if not newLine in content:
    ac.write('\n' + newLine)

答案 2 :(得分:0)

如果文件可以加载到RAM并且具有示例行中给出的结构,则可以将数据作为python对象转储到.pkl中。例如:

import pickle
data = {'15/07/2017': 660,
        '16/07/2017': -200,
        '17/07/2017': 300}
with open('/path/to/the/file.pkl', 'wb') as file:
    pickle.dump(data, file)

pickle文件对python对象友好,您可以利用字典对象的内置方法来避免冗余条目或进行更新。

对于更复杂的结构,请查看pandas.Dataframes。如果您的程序使用python以外的语言,jsonxml可能是更好的选择。