【问题标题】:python: create check digit functionpython:创建校验位函数
【发布时间】:2021-05-01 00:15:43
【问题描述】:

我正在尝试创建校验位并将它们附加到原始 UPC 之后。这是sample data

因为有前导0,所以我必须先将数据读取为字符串:
import pandas as pd upc = pd.read_csv("/Users/lee/Desktop/upc.csv", dtype = str)

以下是校验位算法的示例:
如果 upc 为 003459409000
步骤(1)0 + 3*0 + 3 + 3*4 + 5 + 3*9 + 4 + 3*0 + 9 + 3*0 + 0 + 3*0 = 60
步骤(2)60 mod 10 = 0
步骤(3)check digit = 0 (if it's not 0, then check digit = 10 - number in step 2)

根据算法,代码如下:

def add_check_digit(upc_str):  
upc_str = str(upc_str)
if len(upc_str) != 12: 
raise Exception("Invalid length")

odd_sum = 0
even_sum = 0 
for i, char in enumerate(upc_str): 
j = i+1 
if j % 2 == 0: 
even_sum += int(char) 
else:m 
odd_sum += int(char) 
total_sum = (even_sum * 3) + odd_sum 
mod = total_sum % 10 
check_digit = 10 - mod 
if check_digit == 10: 
check_digit = 0 
return upc_str + str(check_digit) 

如果我运行此代码,它会提供正确的校验位并将此结果附加到原始 UPC 的末尾。对于上面的示例,如果我输入:

add_check_digit('003459409000')

输出给出 13 位 UPC 0034594090000

现在我的问题是:

  1. 此功能仅适用于单个 upc,即我必须复制/粘贴每个单个 upc 并获取校验位。如何创建适用于数据框中的 UPS 列表的函数?每个结果应返回一个 13 位 UPC,并在原始 UPC 之后附加校验位。

  2. UPC 被读取为字符串。如何将该功能应用于 UPC?我想我应该以某种方式将字符串转换为数字。我真的是 python 新手。

  3. 获得新的 UPC 后,如何将结果保存到 csv 文件中?

非常感谢您的帮助。

【问题讨论】:

  • 请提供预期的minimal, reproducible example (MRE)。我们应该能够复制和粘贴您的代码的连续块,执行该文件,并重现您的问题以及跟踪问题点的输出。这让我们可以根据您的测试数据和所需的输出来测试我们的建议。不接受站外链接和文字图片;我们需要您的问题是独立的,以符合本网站的目的。
  • 对不起。我在早些时候发布我的代码时遇到了麻烦。我刚刚用原始代码编辑了我的帖子。
  • 感谢您发布详细信息。试试为这个问题提供的答案。
  • 请编辑您的代码;它仍然无法执行。

标签: python algorithm check-digit upc


【解决方案1】:

为我设置了数据,因为我没有 CSV 文件,以下步骤与您的相同

df = pd.read_csv("/Users/lee/Desktop/upc.csv", dtype = str)

数据设置

import pandas as pd
df=pd.DataFrame({"upc_in_file":['003459409000','003459409001','003459409002']})
def add_check_digit(upc_str):  
    upc_str = str(upc_str)
    if len(upc_str) != 12: 
        raise Exception("Invalid length")

    odd_sum = 0
    even_sum = 0 
    for i, char in enumerate(upc_str): 
        j = i+1 
        if j % 2 == 0: 
            even_sum += int(char) 
        else:
            odd_sum += int(char) 
            total_sum = (even_sum * 3) + odd_sum 
            mod = total_sum % 10 
            check_digit = 10 - mod 
        if check_digit == 10: 
            check_digit = 0 
    return upc_str + str(check_digit) 

将上述函数应用于 upc 列(从文件中读取的列)

df['new_upc']=df['upc_in_file'].apply(add_check_digit)

现在保存文件!

df.to_csv("my_updated_upc.csv")

这看起来像

【讨论】:

  • 它的工作原理就像奇迹!!!!非常感谢你!我真的应该开始学习 python,因为它比 R 更好用。
  • 请接受答案,这样我就可以得分了。欢迎你:)
  • 我相信我成功地检查了你的正确答案。您的代码比 for 循环简单得多。
猜你喜欢
  • 2015-06-29
  • 1970-01-01
  • 1970-01-01
  • 2017-07-01
  • 2021-01-09
  • 2015-04-04
  • 1970-01-01
  • 2021-10-01
相关资源
最近更新 更多