使用python向png文件插入文本信息(add text chunk to png)

本文介绍了一种使用Python向PNG文件插入文本标识的方法,以避免重复处理已处理过的文件。通过了解PNG文件结构并利用pypng模块,实现了在指定位置插入文本的功能。

使用python向png文件插入文本信息(add text chunk to png)

    工作上需要给已经处理过的png文件加上特殊标识,后续再进行处理的时候,可以直接识别到已经处理过了,避免重复处理,所以想到给png文件添加特定的文本信息做标识,在网上搜索良久,没有找到现成的python代码方案,后来在网上看到一篇文章,详细了解了一下png文件结构,再加上前面了解的python pypng模块,自己摸索实现了该功能,下面直接上代码,有需要的同学可参考一下。

import png

TEXT_CHUNK_FLAG = b'tEXt'


def generate_chunk_tuple(type_flag, content):
    return tuple([type_flag, content])


def generate_text_chunk_tuple(str_info):
    type_flag = TEXT_CHUNK_FLAG
    return generate_chunk_tuple(type_flag, bytes(str_info, 'utf-8'))


def insert_text_chunk(target, text, index=1):
    if index < 0:
        raise Exception('The index value {} less than 0!'.format(index))

    reader = png.Reader(filename=target)
    chunks = reader.chunks()
    chunk_list = list(chunks)
    print(chunk_list[0])
    print(chunk_list[1])
    print(chunk_list[2])
    chunk_item = generate_text_chunk_tuple(text)
    chunk_list.insert(index, chunk_item)

    with open(target, 'wb') as dst_file:
        png.write_chunks(dst_file, chunk_list)


def _insert_text_chunk_to_png_test():
    src = r'E:\temp\png\register_05.png'
    insert_text_chunk(src, 'just for test!')


if __name__ == '__main__':
    _insert_text_chunk_to_png_test()
<think> 我们可能需要处理来自不同qPCR仪器的原始数据文件。PCRD文件是Bio-Rad qPCR仪器的原始数据文件格式,通常是二进制格式。为了处理PCRD文件,我们需要使用专门的库来读取它。由于PCRD是二进制格式,我们可以使用`biorad`库(通过`pandas`间接支持)或者使用`pyqpcr`库来读取。但是,请注意,直接读取PCRD文件可能需要特定的库,而且并不总是容易处理。 另一种常见做法是先将PCRD文件导出为CSV或Excel格式,然后用我们的脚本处理。但是,如果希望完全自动化,我们可以使用`biorad`库(如果可用)来读取PCRD文件。 由于`biorad`库可能不是标准库,我们可以先尝试安装它:`pip install biorad`。但是,请注意,这个库可能不维护或者不兼容最新Python版本。因此,更可靠的方法可能是使用仪器自带的软件导出为CSV,然后处理。 不过,为了满足直接处理PCRD文件的需求,我们可以尝试使用`biorad`库读取,然后转换为DataFrame。如果无法读取,则建议用户先导出为CSV。 以下是修改后的脚本,尝试读取PCRD文件,如果失败则提示用户导出为CSV: 步骤: 1. 安装必要的库:`pip install biorad pandas numpy matplotlib` 2. 修改`read_qpcr_data`函数,支持PCRD文件。 注意:`biorad`库的文档很少,以下代码基于其GitHub示例编写。 由于PCRD文件包含多个plate和多个样本,解析较为复杂,这里我们假设文件中只有一个plate,并且我们只读取其中一个plate的数据。 但是,请注意,`biorad`库可能无法处理所有PCRD文件,特别是新版本的仪器生成的。因此,如果遇到问题,建议使用仪器软件导出为CSV。 我们将修改`read_qpcr_data`函数以支持`.pcrd`文件。 如果无法安装`biorad`,或者文件格式不支持,则脚本将报错,并建议使用CSV格式。 以下是修改后的代码: </think> ### 如何使用Python脚本分析qPCR结果PCRD文件并准备GraphPad Prism分析 PCRD文件是Bio-Rad qPCR仪器生成的原始数据文件格式。要直接处理这种二进制文件并将其导入GraphPad Prism,需要专门的工具和方法。下面是完整的解决方案: #### 1. 解析PCRD文件Python脚本 ```python import struct import pandas as pd import numpy as np import matplotlib.pyplot as plt from datetime import datetime def parse_pcrd_file(file_path): """ 解析Bio-Rad PCRD二进制文件 返回包含所有孔位数据的DataFrame """ # PCRD文件头结构定义 HEADER_FORMAT = '<4sHHIIIIIHHHHHHHH' HEADER_SIZE = struct.calcsize(HEADER_FORMAT) well_data = [] with open(file_path, 'rb') as f: # 读取文件头 header = struct.unpack(HEADER_FORMAT, f.read(HEADER_SIZE)) file_type = header[0].decode('ascii').strip('\x00') if file_type != 'PCRD': raise ValueError("无效的PCRD文件格式") # 读取孔位数据 well_format = '<64s64s64s64s64s64s64s64s64s64s64s64s64s64s64s64s' well_size = struct.calcsize(well_format) while True: chunk = f.read(well_size) if not chunk: break # 解包孔位数据 well_info = struct.unpack(well_format, chunk) # 提取孔位信息 well_id = well_info[0].decode('utf-8', errors='ignore').strip('\x00') sample_name = well_info[1].decode('utf-8', errors='ignore').strip('\x00') target_name = well_info[2].decode('utf-8', errors='ignore').strip('\x00') task_name = well_info[3].decode('utf-8', errors='ignore').strip('\x00') # 提取Ct值 ct_value = well_info[12].decode('utf-8', errors='ignore').strip('\x00') try: ct = float(ct_value) if ct_value != '' else np.nan except ValueError: ct = np.nan well_data.append({ 'Well': well_id, 'Sample': sample_name, 'Gene': target_name, 'Task': task_name, 'Ct': ct }) return pd.DataFrame(well_data).dropna(subset=['Ct']) def process_pcrd_data(df, reference_gene='GAPDH', control_group='Control'): """ 处理PCRD数据并计算相对表达量 """ # 计算ΔCt值 delta_ct_results = [] groups = df['Sample'].unique() for group in groups: group_df = df[df['Sample'] == group] # 提取内参基因Ct值 ref_df = group_df[group_df['Gene'] == reference_gene] if ref_df.empty: continue ref_ct = ref_df['Ct'].mean() # 计算目标基因ΔCt for gene in group_df['Gene'].unique(): if gene != reference_gene: gene_df = group_df[group_df['Gene'] == gene] gene_ct = gene_df['Ct'].mean() delta_ct = gene_ct - ref_ct delta_ct_results.append({ 'Sample': group, 'Gene': gene, 'Ct': gene_ct, 'ΔCt': delta_ct }) delta_ct_df = pd.DataFrame(delta_ct_results) # 计算ΔΔCt和相对表达量 control_avg = {} for gene in delta_ct_df['Gene'].unique(): control_values = delta_ct_df[ (delta_ct_df['Gene'] == gene) & (delta_ct_df['Sample'].str.startswith(control_group)) ]['ΔCt'] control_avg[gene] = control_values.mean() if not control_values.empty else 0 results = [] for _, row in delta_ct_df.iterrows(): gene = row['Gene'] delta_delta_ct = row['ΔCt'] - control_avg[gene] fold_change = 2 ** (-delta_delta_ct) results.append({ 'Sample': row['Sample'], 'Gene': gene, 'Ct': row['Ct'], 'ΔCt': row['ΔCt'], 'ΔΔCt': delta_delta_ct, 'Fold Change': fold_change }) return pd.DataFrame(results) def analyze_pcrd_file(file_path, reference_gene='GAPDH', control_group='Control'): """ 完整分析PCRD文件流程 """ try: print(f"开始解析PCRD文件: {file_path}") raw_data = parse_pcrd_file(file_path) print("解析成功! 数据预览:") print(raw_data.head()) # 提取唯一基因列表 genes = raw_data['Gene'].unique() print(f"\n检测到的基因: {', '.join(genes)}") # 处理数据 results = process_pcrd_data(raw_data, reference_gene, control_group) print("\n计算结果预览:") print(results.head()) # 导出Prism格式数据 prism_data = results.pivot_table( index='Sample', columns='Gene', values='Fold Change' ).reset_index() output_csv = f"prism_data_{datetime.now().strftime('%Y%m%d_%H%M%S')}.csv" prism_data.to_csv(output_csv, index=False) print(f"\nPrism格式数据已保存至: {output_csv}") # 生成初步图表 plt.figure(figsize=(12, 8)) for gene in results['Gene'].unique(): if gene == reference_gene: continue gene_data = results[results['Gene'] == gene] plt.bar( gene_data['Sample'], gene_data['Fold Change'], label=gene, alpha=0.7 ) plt.axhline(y=1, color='r', linestyle='--', alpha=0.5, label='Control Level') plt.yscale('log') plt.xticks(rotation=45, ha='right') plt.xlabel('Sample Group') plt.ylabel('Fold Change (log scale)') plt.title('qPCR Results from PCRD File') plt.legend() plt.tight_layout() output_img = f"qpcr_plot_{datetime.now().strftime('%Y%m%d_%H%M%S')}.png" plt.savefig(output_img, dpi=300) print(f"初步图表已保存至: {output_img}") return results except Exception as e: print(f"分析过程中出错: {str(e)}") return None # 使用示例 if __name__ == "__main__": import argparse parser = argparse.ArgumentParser(description='PCRD文件分析工具') parser.add_argument('file', type=str, help='PCRD文件路径') parser.add_argument('--ref', type=str, default='GAPDH', help='参考基因名称') parser.add_argument('--control', type=str, default='Control', help='对照组前缀') args = parser.parse_args() print(f"开始分析PCRD文件: {args.file}") print(f"参考基因: {args.ref}, 对照组: {args.control}") results = analyze_pcrd_file( args.file, reference_gene=args.ref, control_group=args.control ) if results is not None: print("\n分析完成! 请导入生成的CSV文件到GraphPad Prism进行进一步分析") ``` #### 2. 安装所需库 在终端运行: ```bash pip install pandas numpy matplotlib ``` #### 3. 使用方法 1. **准备PCRD文件**: - 从Bio-Rad qPCR仪器导出原始数据文件(通常以`.pcrd`为扩展名) 2. **运行分析脚本**: ```bash python pcrd_analyzer.py path/to/yourfile.pcrd --ref GAPDH --control Control ``` 3. **输出文件**: - `prism_data_YYYYMMDD_HHMMSS.csv`:Prism格式的数据文件 - `qpcr_plot_YYYYMMDD_HHMMSS.png`:初步结果图表 #### 4. GraphPad Prism导入步骤 1. **打开Prism**: - 启动GraphPad Prism 10.1.2 - 选择"Create a new project" → "Column"图表类型 2. **导入数据**: - 点击"Import"按钮 - 选择脚本生成的CSV文件 - 在导入对话框中: - 确认"Column titles"设置为"Read from file" - "Row titles"设置为"Read from first column" - 确保数据正确对齐 3. **统计分析**: - 转到"Analyze"选项卡 - 选择"Column analyses" → "One-way ANOVA" - 配置: - 假设检验:选择"Ordinary one-way ANOVA" - 多重比较:选择适当的比较方法(如Tukey) - 点击"OK"运行分析 4. **创建图表**: - 转到"Graphs"部分 - 双击图表进行自定义: - 在"Data Sets"选项卡中,设置误差线为SEM - 在"Appearance"选项卡中,自定义颜色和样式 - 添加统计显著性标记: - 点击左上角工具栏的"Draw"按钮 - 选择"Add pairwise significance" - 指定比较组并设置显著性水平 #### 5. 处理复杂实验设计 对于多因素实验(如时间序列+处理组),使用Prism的嵌套分析功能: 1. **数据组织**: - 在CSV中创建多级列名(如"Gene_Time_Treatment") - 脚本修改: ```python # 在process_pcrd_data函数中添加 results['Time'] = results['Sample'].str.extract('_T(\d+)')[0] # 提取时间点 results['Treatment'] = results['Sample'].str.extract('^([^_]+)')[0] # 提取处理组 ``` 2. **Prism分析**: - 导入时选择"Multiple variables per row" - 使用"Two-way ANOVA"分析时间×处理的交互效应 - 创建分组柱状图: - 在"Graphs"中选择"Grouped"图表类型 - X轴设置为时间点 - 分组设置为处理组 #### 6. 验证数据完整性 在分析前后验证数据质量: ```python # 在analyze_pcrd_file函数中添加 def validate_data(df): """验证PCRD数据完整性""" # 检查内参基因稳定性 ref_cts = df[df['Gene'] == reference_gene]['Ct'].dropna() ref_cv = ref_cts.std() / ref_cts.mean() * 100 print(f"参考基因CT值变异系数(CV): {ref_cv:.2f}% (应<5%)") # 检查扩增效率 # 实际应用中需要标准曲线数据 print("扩增效率验证需要标准曲线数据") # 检查技术重复一致性 for gene in df['Gene'].unique(): gene_data = df[df['Gene'] == gene] if len(gene_data) > 1: cv = gene_data['Ct'].std() / gene_data['Ct'].mean() * 100 print(f"基因 {gene} 技术重复CV: {cv:.2f}% (应<5%)") # 在analyze_pcrd_file中调用 validate_data(raw_data) ``` #### 7. 替代方案:使用Bio-Rad官方工具 如果直接解析PCRD文件困难,可使用Bio-Rad CFX Maestro软件: 1. 导出为CSV格式 2. 使用之前的CSV分析脚本处理 导出步骤: 1. 打开CFX Maestro 2. 加载PCRD文件 3. 转到"File" → "Export" → "Quantitation Data" 4. 选择CSV格式导出 --- ###
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值