执行追加操作后,目标文件出现不一致的行为



我在向文件添加条目时遇到了一个奇怪的问题。

关于代码的一点背景知识,它是一组Python模块,其中,
  • 第一个模块负责比较两个CSV文件[主记录和最新记录::这两个文件包含具有特定属性的对象],拉出两个文件之间的增量,并调用第二个模块使用api在web服务器上创建/修改/删除某些对象。

  • 第二个模块负责使用Python 'requests'库通过API与Webserver进行交互。此模块根据对某条记录所采取的操作更新[add/new/delete]主记录CSV文件中的条目。

  • 最后,第一个模块将增量对象记录和对这些对象所做的操作打印到终端,如下所示,

+----+-----------+---------------+----------------+------------+----------+--------------------------------------+--------------------------------------------+
|    | UE_NAME   | UE_TYPE       | ES_NAME        | APN_NAME   | STATUS   | UE_ROUTES_OPERATION(MOBILE_ROUTER)   | UE_ROUTES(MOBILE_ROUTER)                   |
+====+===========+===============+================+============+==========+======================================+============================================+
|  0 | ue_1      | MOBILE_ROUTER | Edge_service_4 | apn1862    | UE_ADDED | UE_ROUTE_ADDED                       | ['172.16.10.0/26(A)']                      |
+----+-----------+---------------+----------------+------------+----------+--------------------------------------+--------------------------------------------+
|  1 | ue_6      | IOT_MOBILE    | Edge_service_1 | apn_nuage  | UE_ADDED | --                                   | --                                         |
+----+-----------+---------------+----------------+------------+----------+--------------------------------------+--------------------------------------------+
|  2 | ue_2      | MOBILE_ROUTER | Edge_service_4 | apn1862    | UE_ADDED | UE_ROUTE_ADDED                       | ['172.16.10.0/18(A)', '172.16.12.0/24(A)'] |
+----+-----------+---------------+----------------+------------+----------+--------------------------------------+--------------------------------------------+
|  3 | ue_201    | MOBILE_ROUTER | test1          | apn_nuage  | UE_ADDED | UE_ROUTE_ADDED                       | ['172.16.10.0/16 (A)']                     |
+----+-----------+---------------+----------------+------------+----------+--------------------------------------+--------------------------------------------+

现在,回到问题上,从代码的角度来看,一切都很好。但是,我看到更新被附加到Master_record文件的问题。初始执行此工具后,看到以下主记录CSV,

more .master_records.csv
name,IMSI,MSISDN,ICCID,IMEI,Enterprise,operationalStatus,ueType,ueRoutes,description,apn_name
ue_1,1,1,1,1,Edge_service_4,IDLE,MOBILE_ROUTER,"172.16.10.0/26",UE-1-desc,apn1862
ue_6,6,6,6,6,Edge_service_1,CONNECTED,IOT_MOBILE,,UE-6,apn_nuage
ue_2,2,2,2,2,Edge_service_4,CONNECTED,MOBILE_ROUTER,"172.16.10.0/18,172.16.12.0/24",UE-2-desc,apn1862
ue_201,201,201,201,203,test1,IDLE,MOBILE_ROUTER,"172.16.10.0/16 ",UE-201,apn_nuage

但是,在修改了其中一个表项后[例如,ue_1在"Latest_records.csv"中,ue_201的Object记录缺少双引号,脚本完成后,master_records文件位于,

more .master_records.csv
name,IMSI,MSISDN,ICCID,IMEI,Enterprise,operationalStatus,ueType,ueRoutes,description,apn_name
ue_6,6,6,6,6,Edge_service_1,CONNECTED,IOT_MOBILE,,UE-6,apn_nuage
ue_2,2,2,2,2,Edge_service_4,CONNECTED,MOBILE_ROUTER,"172.16.10.0/18,172.16.12.0/24",UE-2-desc,apn1862
ue_201,201,201,201,203,test1,IDLE,MOBILE_ROUTER,172.16.10.0/16 ,UE-201,apn_nuage
ue_1,1,1,1,1,Edge_service_4,CONNECTED,MOBILE_ROUTER,"172.16.10.0/26",UE-1-desc,apn1862

您可以看到,172.16.10.0/16周围的双引号缺少对象,ue_201

这个问题只出现在只有一个对象在'ueRoutes'列的情况下,如果我有多个像"172.16.10.0/18172.16.12.0/24"这样的对象,我不会看到这个问题。

更新主记录的代码非常简单,如下所示,

def add_entry_master_record(row_entry):
"""
Adds a UE Entry to Master Record file.
:param row_entry: UE record Entry.
:return: Updates the existing Master Record file.
"""
try:
with open(m_record, 'a+') as master_record_update:
master_record_update.write(row_entry)
master_record_update.write('n')
except FileNotFoundError as err_file:
raise SystemExit(err_file)

在检查'row_entry'的内容时,我没有看到ue_201的Master_record文件有任何更新,只有ue_1的更新,如下所示,

row_entry = ue_1,1,1,1,1,Edge_service_4,CONNECTED,MOBILE_ROUTER,"172.16.10.0/26",UE-1-desc,apn1862

一旦出现这种不规则性,它就会开始扰乱我的代码,因为latest_record和master_record文件之间的增量计算也会产生非增量内容。我能够通过在比较之前使用一些正则表达式替换来解决这个问题,但是我仍然很好奇为什么这种不规则性会发生在第一位。

关于如何更新Master_record文件的注释:

  • 我使用以下代码,其中我删除现有对象的old_record,并在使用之前共享的附加代码修改现有对象后添加新记录,
def drop_rows_master_record(ue_name, mod_entry):
"""
Drops the Entries from Master Record csv file.
:param ue_name: UE Name for which Entry needs to be dropped.
:param mod_entry: UE Record
:return: Drops the deleted/modified UE record from Master Records.
"""
df = pd.read_csv(m_record)
df_filtered = df[(df['name'].str.lower() == ue_name.lower()) &
(df['Enterprise'].str.lower() == mod_entry['Enterprise'].lower())]
df.drop(df_filtered.index, inplace=True)
df.reset_index(drop=True, inplace=True)
df.to_csv(m_record, index=False)

让我知道,如果你们能分享一个指针,为什么这种差异会悄悄出现,首先。

我找到了这个问题的根源。这不是Pandas或Python的问题。:(Pandas只是确认CSV格式,如果在列中定义了单个元素,则删除引号。

因此,例如,如果一个CSV列只有一个值,如

ue_routes
10.18.19.0/24

在文本文件中,我们将看到不带引号的。

但是,如果一个CSV列有多个值,

ue_routes
10.18.19.0/24, 10.18.20.0/24

在文本文件中,我们会看到它带有引号。

相关内容

  • 没有找到相关文章

最新更新